Lệnh strace trong linux với các ví dụ dễ hiểu

Lệnh strace trong linux là một công cụ dòng lệnh mạnh mẽ, giúp bạn theo dõi các lời gọi hệ thống mà một chương trình thực hiện. Nó cho phép bạn hiểu rõ hơn về cách chương trình tương tác với kernel, từ đó dễ dàng gỡ lỗi hoặc phân tích hiệu năng. Sử dụng strace, bạn có thể xem các hoạt động như mở file, gửi dữ liệu qua mạng, hoặc quản lý bộ nhớ một cách chi tiết.

Lệnh strace trong linux là gì?

Lệnh command strace in linux là một công cụ chẩn đoán mạnh mẽ, cho phép bạn theo dõi các lời gọi hệ thống mà một chương trình thực hiện. Nó giúp bạn hiểu rõ hơn về cách chương trình tương tác với kernel và các tài nguyên hệ thống khác. Sử dụng strace, bạn có thể phát hiện các vấn đề như lỗi truy cập tệp, lỗi mạng hoặc các vấn đề hiệu suất tiềm ẩn. Ví dụ, bạn có thể xem chương trình đang cố gắng mở tệp nào hoặc gửi dữ liệu đến đâu. Đây là một công cụ vô giá cho việc gỡ lỗi và phân tích hành vi của ứng dụng trên hệ thống Linux.

Giới thiệu về Lệnh strace

Trong bước này, chúng ta sẽ khám phá lệnh strace, một công cụ mạnh mẽ trên Linux. Công cụ này cho phép bạn theo dõi các system call được thực hiện bởi một tiến trình đang chạy. System call là giao diện giữa tiến trình và hệ điều hành, rất quan trọng để gỡ lỗi. Hãy bắt đầu bằng việc cài đặt gói strace trên hệ thống của bạn một cách dễ dàng.
sudo apt-get update
sudo apt-get install -y strace
Đây là một ví dụ về kết quả sau khi bạn thực hiện lệnh cài đặt.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libunwind8
Suggested packages:
  fakeroot
The following NEW packages will be installed:
  libunwind8 strace
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 292 kB of archives.
After this operation, 1,054 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...
Bây giờ, hãy thử sử dụng lệnh strace để theo dõi một chương trình đơn giản. Chúng ta sẽ sử dụng lệnh ls làm ví dụ minh họa.
strace ls
Đây là một ví dụ về kết quả bạn có thể thấy khi chạy lệnh strace với ls.
execve("/usr/bin/ls", ["ls"], 0x7ffee4f7a0f0 /* 23 vars */) = 0
brk(NULL)                               = 0x55b7d6c23000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
Kết quả hiển thị chuỗi các system call được thực hiện bởi lệnh ls. Các system call bao gồm execve để thực thi lệnh, brk để cấp phát bộ nhớ. Ngoài ra còn có access để kiểm tra quyền truy cập file và openat để mở file cache của dynamic linker. Bằng cách phân tích kết quả strace, bạn có thể hiểu rõ hơn về cách chương trình tương tác với hệ điều hành. Điều này rất hữu ích cho việc gỡ lỗi và hiểu hành vi của chương trình.

Theo Dõi System Calls với strace

Trong bước này, chúng ta sẽ tìm hiểu sâu hơn về cách dùng lệnh strace để theo dõi system calls của một process đang chạy.

Hãy bắt đầu bằng việc tạo một Python script đơn giản để chúng ta có thể dùng cho việc theo dõi:

cat > ~/project/example.py << EOF
import time

print("Hello, World!")
time.sleep(5)
EOF

Bây giờ, hãy theo dõi quá trình thực thi của script này bằng strace:

strace python ~/project/example.py

Ví dụ về output:

execve("/usr/bin/python", ["python", "/home/labex/project/example.py"], 0x7ffee4f7a0f0 /* 23 vars */) = 0
brk(NULL)                               = 0x55b7d6c23000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
write(1, "Hello, World!\n", 14)         = 14
time(NULL)                              = 1618304400
nanosleep({5, 0}, NULL)                 = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Output cho thấy chuỗi system calls được thực hiện bởi Python script. Nó bao gồm execve để chạy Python interpreter, write để in ra "Hello, World!", time để lấy thời gian hiện tại, và nanosleep để tạm dừng script trong 5 giây.

Bạn có thể dùng output của strace để hiểu cách chương trình tương tác với hệ điều hành và xác định các vấn đề tiềm ẩn hoặc điểm nghẽn hiệu năng.

Hãy thử một ví dụ khác, lần này theo dõi việc thực thi lệnh ls với một vài tùy chọn bổ sung:

strace -c ls -l ~/project

Ví dụ về output:

total 4
-rw-r--r-- 1 labex labex 59 Apr 12 13:33 example.py
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 45.45    0.000005           5         1           execve
 27.27    0.000003           3         1           brk
  9.09    0.000001           1         1           access
  9.09    0.000001           1         1           openat
  9.09    0.000001           1         1           close
  0.00    0.000000           0         4           read
  0.00    0.000000           0         2           fstat
  0.00    0.000000           0         1           mmap
  0.00    0.000000           0         1           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         1           statfs
  0.00    0.000000           0         1           access
  0.00    0.000000           0         2           newfstatat
  0.00    0.000000           0         2           close
------ ----------- ----------- --------- --------- ----------------
100.00    0.000011                    22           total

Trong ví dụ này, chúng ta dùng tùy chọn -c để lấy bản tóm tắt các system calls được thực hiện bởi lệnh ls. Output cho thấy phần trăm thời gian dành cho mỗi system call, số lượng calls và số lượng lỗi.

Thông tin này có thể hữu ích để xác định các điểm nghẽn hiệu năng hoặc hiểu hành vi của một chương trình.

Gỡ Lỗi Tiến Trình với strace

Trong bước này, chúng ta sẽ học cách dùng lệnh strace để gỡ lỗi các tiến trình đang chạy và tìm ra vấn đề tiềm ẩn.

Hãy bắt đầu bằng việc tạo một chương trình C đơn giản để chúng ta có thể dùng nó cho việc gỡ lỗi:

cat > ~/project/example.c << EOF
#include <stdio.h>
#include <unistd.h>

int main() {
    printf("Hello, World!\n");
    sleep(5);
    return 0;
}
EOF

Bây giờ, hãy biên dịch chương trình và chạy nó với strace để xem điều gì xảy ra:

gcc -o ~/project/example ~/project/example.c
strace ~/project/example

Ví dụ về kết quả:

execve("/home/labex/project/example", ["/home/labex/project/example"], 0x7ffee4f7a0f0 /* 23 vars */) = 0
brk(NULL)                               = 0x55b7d6c23000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
write(1, "Hello, World!\n", 14)         = 14
time(NULL)                              = 1618304400
sleep(5)                                = 5
exit_group(0)                           = ?
+++ exited with 0 +++

Kết quả cho thấy trình tự các system call mà chương trình C đã thực hiện. Nó bao gồm execve để chạy chương trình, write để in ra "Hello, World!", và sleep để tạm dừng chương trình trong 5 giây.

Giả sử chúng ta muốn gỡ lỗi một vấn đề với chương trình, strace có thể giúp ta xác định nguyên nhân. Ví dụ, chương trình không ghi kết quả ra file như mong đợi.

Chúng ta có thể theo dõi các system call liên quan đến file để xem điều gì đang xảy ra bằng lệnh sau:

strace -e trace=file ~/project/example

Ví dụ về kết quả:

execve("/home/labex/project/example", ["/home/labex/project/example"], 0x7ffee4f7a0f0 /* 23 vars */) = 0
write(1, "Hello, World!\n", 14)         = 14
time(NULL)                              = 1618304400
sleep(5)                                = 5
exit_group(0)                           = ?
+++ exited with 0 +++

Kết quả cho thấy chương trình không thực hiện bất kỳ system call nào liên quan đến file. Điều này gợi ý rằng vấn đề không liên quan đến thao tác file.

Bằng cách dùng strace để theo dõi các system call cụ thể hoặc toàn bộ hoạt động system call, bạn có thể tìm ra nguyên nhân gốc rễ của vấn đề và gỡ lỗi hiệu quả hơn.

Kết luận cho linux strace command

Vậy là chúng ta đã cùng nhau khám phá sức mạnh của strace trong Linux rồi! Hy vọng qua bài viết này, bạn đã hiểu rõ hơn về cách công cụ này hoạt động và ứng dụng của nó trong việc gỡ lỗi. Linux strace command thực sự là một người bạn đồng hành đắc lực cho các nhà phát triển và quản trị hệ thống. Nó giúp chúng ta "nhìn trộm" vào bên trong chương trình, xem nó đang giao tiếp với hệ điều hành như thế nào. Đừng ngần ngại thử nghiệm với các tùy chọn khác nhau của strace để khám phá thêm nhiều điều thú vị. Chắc chắn rằng, việc làm quen với strace sẽ giúp bạn giải quyết các vấn đề một cách hiệu quả hơn. Chúc bạn thành công trên con đường chinh phục Linux và gỡ lỗi phần mềm!

Last Updated : 16/10/2025