Hướng dẫn sử dụng lệnh strace trong Linux từ A-Z [2026]

📌 TÓM TẮT:

strace là công cụ dòng lệnh trên Linux dùng để ghi lại toàn bộ system call (lời gọi hệ thống) và signal mà một tiến trình thực hiện — không cần source code, không cần recompile.

Bài viết này gồm:

  • Lệnh strace trong Linux là gì, hoạt động dựa trên cơ chế nào
  • Cách cài đặt trên Debian/Ubuntu, CentOS/RHEL, Fedora
  • Cú pháp lệnh và bảng tùy chọn phổ biến
  • Một số lưu ý khi dùng strace trên production
  • Câu hỏi thường gặp

Chương trình báo lỗi mà không có thông báo rõ ràng. Tiến trình chạy nhưng cứ bị treo. File config đúng theo tài liệu nhưng ứng dụng vẫn không đọc được — những tình huống kiểu này xảy ra thường xuyên hơn tưởng tượng khi quản trị Linux server. strace là công cụ cho phép bạn nhìn thẳng vào luồng tương tác giữa chương trình và kernel để tìm ra chính xác điều gì đang xảy ra.

Hướng dẫn sử dụng lệnh strace trong Linux

Lệnh strace trong Linux là gì?

strace viết tắt của system call tracer. Công cụ này hoạt động bằng cách theo dõi mọi lời gọi hệ thống mà một tiến trình thực hiện — từ việc mở file, đọc/ghi dữ liệu, tạo socket kết nối mạng, cho đến nhận tín hiệu từ hệ điều hành.

Về mặt kỹ thuật, strace dựa vào cơ chế ptrace (process trace) của Linux kernel. Mỗi khi tiến trình được theo dõi thực hiện một system call, kernel tạm dừng tiến trình đó, cho strace ghi lại tên system call, tham số truyền vào và giá trị trả về, sau đó mới cho tiến trình tiếp tục chạy. Đây cũng là lý do strace gây overhead — trên môi trường production chạy tải cao, bạn cần cân nhắc trước khi bật.

XEM THÊM:  HTML Là Gì? Cấu Trúc, Vai Trò & Cách Hoạt Động Chi Tiết Từ A-Z

Điểm mạnh của strace so với các phương pháp debug khác là không yêu cầu source code. Dù ứng dụng là binary đóng, là script không có quyền chỉnh sửa, hay thậm chí là chương trình đang chạy live — strace đều quan sát được.

Linux cung cấp khoảng 200+ system call khác nhau, được liệt kê tại /usr/include/asm/unistd.h. Một số system call phổ biến bạn sẽ thấy thường xuyên khi dùng strace:

System Call Ý nghĩa
openat Mở file
read Đọc dữ liệu từ file descriptor
write Ghi dữ liệu vào file descriptor
close Đóng file descriptor
execve Khởi chạy chương trình
mmap Ánh xạ vùng bộ nhớ
connect Kết nối socket mạng
getdents64 Đọc danh sách file trong thư mục
access Kiểm tra quyền truy cập file

Cách cài đặt strace

Phần lớn distro Linux hiện đại đã có sẵn strace trong repository mặc định. Kiểm tra bằng lệnh which strace trước — nếu trả về đường dẫn thì đã có, không cần cài thêm.

Trên Debian / Ubuntu

sudo apt update
sudo apt install strace

Trên CentOS / RHEL

sudo yum install strace

Trên Fedora

sudo dnf install strace

Kiểm tra phiên bản sau khi cài

strace --version

Output mẫu:

strace -- version 5.16
Copyright (c) 1991-2022 The strace authors.

Hướng dẫn giám sát và phân tích hệ thống Linux bằng lệnh strace

Công cụ strace mang đến hàng loạt tham số hữu ích giúp bạn theo dõi sát sao mọi hoạt động của các tiến trình trên hệ thống. Dưới đây là 10 phương pháp sử dụng strace phổ biến nhất dành cho quản trị viên:

1. Quan sát System Call (Lời gọi hệ thống), tham số và giá trị trả về

strace ls

Giải thích: Trong ví dụ này, chúng ta dùng strace để giám sát tiến trình ls. Output xuất ra sẽ liệt kê chi tiết các lời gọi hệ thống, đi kèm các tham số (nằm trong dấu ngoặc đơn) và kết quả của lệnh. Nếu bạn thấy dòng chữ +++ exited with 0 +++ ở cuối, điều đó có nghĩa là chương trình đã kết thúc thành công. Nếu có lỗi xảy ra, mã thoát (exit code) thường sẽ báo là -1.

Quan sát System Call

2. Thống kê tổng số lượng các System Call

strace -c ls

Giải thích: Lệnh ls là lệnh cần theo dõi. Tham số -c giúp bạn tạo ra một bảng báo cáo tổng hợp. Thay vì in ra toàn bộ quá trình, nó sẽ hiển thị mỗi lời gọi hệ thống đã được thực thi bao nhiêu lần, tổng số lượng gọi và thời gian tiêu tốn cho mỗi thao tác đó.

XEM THÊM:  Clean Code Là Gì? TOP Quy Tắc & Mẹo Trở Thành Lập Trình Viên Giỏi

Thống kê tổng số lượng các System Call

3. Lọc và chỉ theo dõi một System Call nhất định

strace -e trace=write ls

Giải thích: Khi bạn chỉ muốn tập trung vào một hành động cụ thể (ví dụ: lệnh ghi dữ liệu write), cú pháp này sẽ loại bỏ các thông tin thừa. Kết quả trả về sẽ chỉ hiển thị tên, tham số và kết quả của duy nhất lời gọi hệ thống write.

4. Giám sát các lời gọi hệ thống thuộc nhóm Mạng (Network)

strace -e trace=network nc -v -n 127.0.0.1 801

Giải thích: Ở đây, tiến trình mục tiêu là nc -v -n 127.0.0.1 801. Khi thêm tùy chọn trace=network, hệ thống sẽ tự động lọc và chỉ in ra màn hình các lời gọi hệ thống có liên quan trực tiếp đến các hoạt động giao tiếp mạng.

Giám sát các lời gọi hệ thống thuộc nhóm Mạng

5. Theo dõi các lời gọi hệ thống thuộc nhóm Tín hiệu (Signal)

strace -e trace=signal nc -v -n 127.0.0.1 801

Giải thích: Tương tự như ví dụ trên, nhưng với từ khóa trace=signal, công cụ sẽ tách biệt và chỉ hiển thị các lời gọi hệ thống chịu trách nhiệm xử lý các tín hiệu (signal) của tiến trình.

6. Hiển thị dấu thời gian tương đối (Relative Timestamp)

strace -r ls

Giải thích: Lệnh ls là lệnh cần theo dõi. Tùy chọn -r sẽ chèn thêm một mốc thời gian tương đối tính từ lúc lời gọi hệ thống bắt đầu. Chỉ số này đặc biệt hữu ích khi bạn muốn phân tích khoảng thời gian trễ (delay) giữa hai lời gọi xảy ra liên tiếp.

Hiển thị dấu thời gian tương đối

7. Đo lường thời gian thực thi của từng System Call

strace -T ls

Giải thích: Lệnh ls là lệnh cần theo dõi. Để biết một lời gọi hệ thống tiêu tốn hết bao nhiêu thời gian xử lý, hãy dùng cờ -T. Thông số thời gian thực thi này sẽ được đính kèm ở ngay cuối mỗi dòng kết quả.

8. Gắn mốc thời gian thực (Wall clock time) vào kết quả

strace -t ls

Giải thích: Lệnh ls là lệnh cần theo dõi. Cú pháp này giúp bạn đối chiếu thời gian dễ dàng hơn bằng cách thêm trực tiếp giờ hệ thống (theo mốc thời gian thực) vào đầu mỗi dòng hiển thị lời gọi hệ thống.

Gắn mốc thời gian thực (Wall clock time) vào kết quả

9. In giá trị của con trỏ lệnh (Instruction Pointer – IP)

strace -i ls

Giải thích: Lệnh ls là lệnh cần theo dõi. Dành cho những ai cần debug sâu hơn ở mức phần cứng/bộ nhớ, tùy chọn -i sẽ bổ sung thêm giá trị của thanh ghi con trỏ lệnh (IP) vào mỗi dòng output.

In giá trị của con trỏ lệnh

10. Xuất kết quả giám sát ra tệp tin

strace -o output.txt ls

Giải thích: Thay vì in một danh sách kết quả dài ngoằng ra màn hình terminal, tham số -o sẽ điều hướng toàn bộ dữ liệu theo dõi được và lưu gọn gàng vào tệp văn bản có tên output.txt để bạn tiện xem lại sau.

Lưu ý khi dùng strace trên production

strace làm chậm tiến trình được trace đáng kể vì mỗi system call đều bị kernel dừng lại để ghi nhận. Mức overhead thực tế phụ thuộc vào số lượng system call per giây — với các chương trình I/O-heavy có thể chậm đến 10-20 lần.

Một số điểm cần nhớ:

  • Chỉ trace trong thời gian ngắn khi điều tra sự cố, không để chạy liên tục
  • Dùng -e trace= để lọc chỉ nhóm system call cần thiết, giảm overhead
  • Ứng dụng có thể tự khóa không cho ptrace bằng syscall prctl — trong trường hợp đó strace sẽ không attach được dù có root
  • Trên container Docker hoặc môi trường sandbox, cần thêm capability SYS_PTRACE mới dùng được strace
  • Khi trace nhiều tiến trình con cùng lúc, output sẽ xen lẫn — kết hợp -ff -o để tách log từng process
Bảo mật: Do ptrace hoạt động ở mức kernel, phần mềm độc hại cũng có thể dùng cùng cơ chế này để inject code vào tiến trình khác. Một số distro có module bảo mật Yama giới hạn ptrace — kiểm tra bằng cat /proc/sys/kernel/yama/ptrace_scope. Giá trị 1 hoặc cao hơn nghĩa là chỉ process cha mới trace được process con.

Câu hỏi thường gặp

strace khác ltrace ở điểm nào?

strace theo dõi system call — giao tiếp trực tiếp với Linux kernel. ltrace theo dõi library call — lời gọi đến các hàm trong shared library như libc. Trong thực tế, strace cho bức tranh tổng thể về tương tác với OS, còn ltrace hữu ích hơn khi debug logic ở tầng thư viện.

Có thể dùng strace để debug script Python hoặc Node.js không?

Được, nhưng có giới hạn. strace thấy system call ở tầng OS — read, write, socket, mmap… — chứ không thấy logic Python/JavaScript bên trong. Hữu ích khi ứng dụng gặp lỗi quyền file, kết nối mạng bị từ chối, hoặc cần xem nó đọc/ghi file nào. Không thay thế được debugger ngôn ngữ cho việc trace luồng code.

strace trả về -1 nghĩa là gì?

Giá trị trả về -1 nghĩa là system call thất bại. Kèm theo sẽ có mã lỗi dạng ERRNO (mô tả), ví dụ -1 ENOENT (No such file or directory) hoặc -1 EACCES (Permission denied). Đây là điểm cần tập trung khi debug.

Cần tư vấn giải pháp VPS hoặc Cloud Server cho doanh nghiệp?

Đội ngũ kỹ thuật InterData hỗ trợ 24/7, từ cấu hình server đến tối ưu hệ thống Linux.

📞 1900 636 822 | 🌐 interdata.vn | 📘 facebook.com/interdata.com.vn

Kết luận

strace không phải công cụ dùng hàng ngày, nhưng đúng lúc cần — khi chương trình im lặng chết, khi tiến trình treo không rõ lý do, khi config “đúng” nhưng không chạy — nó là thứ tiết kiệm nhiều giờ đoán mò nhất. Điểm mạnh cốt lõi là không cần source code, không cần recompile, attach được vào bất kỳ tiến trình nào đang chạy.

Để khai thác strace hiệu quả: luôn dùng -e trace= để lọc nhóm liên quan thay vì xem toàn bộ output, kết hợp grep ENOENT\|EACCES để tìm lỗi nhanh, và -c khi cần phân tích hiệu năng. Ba thao tác này xử lý được 80% tình huống debug thực tế.