Giới thiệu
Trong lab này, bạn sẽ học cách sử dụng lệnh ltrace
trong Linux để theo dõi các system call và library call được thực hiện bởi một process. ltrace
là một công cụ mạnh mẽ có thể hữu ích cho việc gỡ lỗi và phân tích hiệu năng. Bạn sẽ bắt đầu bằng cách hiểu mục đích và chức năng của ltrace
, và sau đó khám phá cách sử dụng nó để phân tích hành vi của các ứng dụng. Lab này bao gồm việc theo dõi system call và library call, cũng như giải thích đầu ra của ltrace
để xác định các vấn đề tiềm ẩn. Lưu ý rằng lệnh ltrace
có thể yêu cầu cài đặt trên một số bản phân phối Linux và bạn nên sử dụng các công cụ hiện đại hơn như strace
cho các ứng dụng mới hơn.
Hiểu Mục Đích và Chức Năng của ltrace
Trong bước này, bạn sẽ tìm hiểu về mục đích và chức năng của lệnh ltrace
trong Linux. ltrace
là một công cụ mạnh mẽ cho phép bạn theo dõi các system call và library call được thực hiện bởi một process, điều này có thể hữu ích cho việc gỡ lỗi và phân tích hiệu năng.
Để bắt đầu, hãy cài đặt gói ltrace
trên container Ubuntu 22.04 Docker của chúng ta:
sudo apt-get update
sudo apt-get install -y ltrace
Lệnh ltrace
hoạt động bằng cách chặn và ghi lại các dynamic library call được thực hiện bởi một process. Điều này có thể hữu ích để hiểu cách một ứng dụng đang tương tác với hệ thống bên dưới và xác định các vấn đề tiềm ẩn hoặc các nút thắt cổ chai về hiệu năng.
Hãy thử một ví dụ đơn giản để xem ltrace
hoạt động như thế nào. Tạo một file mới có tên hello.c
trong thư mục ~/project
với nội dung sau:
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
Biên dịch file hello.c
bằng trình biên dịch gcc
:
gcc -o hello hello.c
Bây giờ, hãy chạy chương trình hello
bằng ltrace
:
ltrace ./hello
Ví dụ đầu ra:
__libc_start_main(0x4005d0, 1, 0x7ffee7d9d3c8, 0x400660 <unfinished ...>
puts("Hello, world!") = 14
+++ exited (status 0) +++
Đầu ra cho thấy chương trình hello
đã gọi hàm puts()
từ thư viện chuẩn C để in thông báo "Hello, world!".
ltrace
có thể là một công cụ giá trị để hiểu hoạt động bên trong của một chương trình và xác định các vấn đề tiềm ẩn hoặc các khu vực cần tối ưu hóa. Trong bước tiếp theo, bạn sẽ học cách sử dụng ltrace
để theo dõi system call và library call chi tiết hơn.
Theo Dõi System Call và Library Call với ltrace
Trong bước này, bạn sẽ học cách sử dụng lệnh ltrace
để theo dõi system call và library call được thực hiện bởi một process.
Hãy bắt đầu bằng cách tạo một file mới có tên syscall.c
trong thư mục ~/project
với nội dung sau:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Hello, world!\n");
sleep(2);
return 0;
}
Chương trình này chỉ đơn giản in "Hello, world!" và sau đó tạm dừng trong 2 giây.
Bây giờ, hãy biên dịch file syscall.c
và chạy nó bằng ltrace
:
gcc -o syscall syscall.c
ltrace ./syscall
Ví dụ đầu ra:
__libc_start_main(0x4005d0, 1, 0x7ffee7d9d3c8, 0x400660 <unfinished ...>
puts("Hello, world!") = 14
sleep(2) = 0
+++ exited (status 0) +++
Đầu ra cho thấy chương trình syscall
đã gọi hàm puts()
để in thông báo "Hello, world!", và một lệnh gọi đến hàm sleep()
để tạm dừng chương trình trong 2 giây.
Bạn cũng có thể sử dụng tùy chọn -c
với ltrace
để có được bản tóm tắt về system call và library call được thực hiện bởi process:
ltrace -c ./syscall
Ví dụ đầu ra:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
66.67 0.000002 2 1 write
33.33 0.000001 1 1 sleep
00.00 0.000000 0 1 fwrite
00.00 0.000000 0 1 __libc_start_main
00.00 0.000000 0 1 puts
------ ----------- ----------- --------- --------- ----------------
100.00 0.000003 5 total
Đầu ra này cung cấp một phân tích chi tiết về system call và library call được thực hiện bởi chương trình syscall
, bao gồm thời gian dành cho mỗi lệnh gọi và số lần mỗi lệnh gọi được thực hiện.
ltrace
có thể là một công cụ mạnh mẽ để hiểu hành vi của một chương trình và xác định các vấn đề tiềm ẩn về hiệu năng hoặc các khu vực cần tối ưu hóa. Trong bước tiếp theo, bạn sẽ học cách phân tích đầu ra của ltrace
và xác định các vấn đề tiềm ẩn.
Phân Tích Đầu Ra của ltrace và Xác Định Các Vấn Đề Tiềm Ẩn
Trong bước cuối cùng này, bạn sẽ học cách phân tích đầu ra của lệnh ltrace
và xác định các vấn đề tiềm ẩn trong ứng dụng của bạn.
Hãy bắt đầu bằng cách tạo một file mới có tên leaks.c
trong thư mục ~/project
với nội dung sau:
#include <stdlib.h>
int main() {
int *ptr = malloc(100 * sizeof(int));
// Do something with the memory
return 0;
}
Chương trình này cấp phát động bộ nhớ có kích thước tương đương 100 số nguyên, nhưng nó không giải phóng bộ nhớ trước khi chương trình thoát. Điều này có thể dẫn đến rò rỉ bộ nhớ.
Bây giờ, hãy biên dịch file leaks.c
và chạy nó bằng ltrace
:
gcc -o leaks leaks.c
ltrace ./leaks
Ví dụ đầu ra:
__libc_start_main(0x4005d0, 1, 0x7ffee7d9d3c8, 0x400660 <unfinished ...>
malloc(400) = 0x1b6a010
+++ exited (status 0) +++
Đầu ra cho thấy chương trình leaks
đã gọi hàm malloc()
để cấp phát 400 byte bộ nhớ (100 số nguyên), nhưng nó không gọi free()
để giải phóng bộ nhớ trước khi chương trình thoát.
Đây là một rò rỉ bộ nhớ tiềm ẩn, có thể dẫn đến việc chương trình tiêu thụ ngày càng nhiều bộ nhớ theo thời gian, có khả năng gây ra các vấn đề về hiệu năng hoặc thậm chí làm sập hệ thống.
Để xác định vấn đề này, bạn có thể sử dụng lệnh ltrace
với tùy chọn -T
để hiển thị thời gian đã sử dụng trong mỗi lệnh gọi hàm:
ltrace -T ./leaks
Ví dụ đầu ra:
__libc_start_main(0x4005d0, 1, 0x7ffee7d9d3c8, 0x400660 <unfinished ...>
malloc(400) = 0x1b6a010 <0.000022>
+++ exited (status 0) +++
Đầu ra cho thấy lệnh gọi malloc()
mất 0,000022 giây để thực hiện, nhưng không có lệnh gọi free()
tương ứng, cho thấy có khả năng rò rỉ bộ nhớ.
Bằng cách phân tích đầu ra của ltrace
, bạn có thể xác định các vấn đề tiềm ẩn trong ứng dụng của mình, chẳng hạn như rò rỉ bộ nhớ, quản lý tài nguyên không đúng cách hoặc system call không mong muốn. Thông tin này có thể có giá trị để gỡ lỗi và tối ưu hóa ứng dụng của bạn.
Trong lab này, bạn đã học cách sử dụng lệnh ltrace
để theo dõi system call và library call, đồng thời cách phân tích đầu ra để xác định các vấn đề tiềm ẩn. Kiến thức này có thể được áp dụng cho nhiều loại ứng dụng và có thể giúp bạn trở thành một systemadmin hoặc nhà phát triển Linux hiệu quả hơn.
Tóm tắt
Trong lab này, trước tiên bạn đã tìm hiểu về mục đích và chức năng của lệnh ltrace
trong Linux. ltrace
là một công cụ mạnh mẽ cho phép bạn theo dõi system call và library call được thực hiện bởi một process, điều này có thể hữu ích cho việc gỡ lỗi và phân tích hiệu năng. Sau đó, bạn đã học cách sử dụng ltrace
để theo dõi system call và library call được thực hiện bởi một chương trình và cách phân tích đầu ra để xác định các vấn đề tiềm ẩn hoặc các khu vực cần tối ưu hóa.