1. Giới Thiệu
Chúc mừng năm mới các bạn! Mình hy vọng các bạn đã có một kỳ nghỉ Tết vui vẻ. Trong bài viết hôm nay, mình sẽ hướng dẫn các bạn cách sử dụng lệnh strace để theo dõi các vấn đề khi chương trình của bạn gặp sự cố liên quan đến các chương trình khác. Thông thường, để tiến hành gỡ lỗi (debug) một ứng dụng, bạn cần mã nguồn, và bạn sẽ phải đọc, hiểu và tìm ra lỗi trong mã. Nhưng sẽ ra sao nếu sự cố lại liên quan đến một chương trình khác mà bạn không có mã nguồn?
Khi bạn lập trình bằng Java, bạn sẽ sử dụng các công cụ khác để biên dịch dự án; nếu bạn dùng Node.js, bạn sẽ dùng npm làm trình quản lý gói. Khi những công cụ này gặp sự cố hoặc thông báo lỗi không rõ ràng, bạn sẽ gặp rắc rối. Bài viết này có mục đích giúp bạn dễ dàng theo dõi hoạt động của hệ thống Linux khi các vấn đề này xảy ra.
Hy vọng bài viết sẽ hữu ích cho công việc của bạn và không khuyến khích việc lạm dụng công cụ này.
2. strace Là Gì?
Strace là một phần mềm trên Linux dùng để theo dõi các tín hiệu syscall.
Syscall là một phần quan trọng của hệ điều hành, cho phép mã chạy trong không gian người dùng (user space) gửi yêu cầu đến kernel để truy cập các dịch vụ hệ thống như truy xuất thiết bị phần cứng, quản lý tệp tin, tiến trình, và cấp phát bộ nhớ.
Phần lớn ứng dụng bạn phát triển sẽ chạy trong không gian người dùng với quyền hạn hạn chế. Khi ứng dụng cần thực hiện những thao tác ở mức thấp, nó sẽ gọi syscall để tương tác với kernel. Ví dụ về syscall bao gồm các lệnh như open
để mở tệp tin, hoặc write
để ghi dữ liệu vào tệp tin.
3. Lợi Ích Của Việc Tách Biệt Giữa User Space Và Kernel Space
3.1 Bảo Vệ Dữ Liệu Nhạy Cảm
Nếu mọi chương trình đều có quyền truy cập đầy đủ vào hệ thống, điều này sẽ tạo ra nhiều rủi ro lớn. Kernel đảm bảo rằng các chương trình được tách biệt và có không gian nhớ riêng, giúp bảo mật dữ liệu. Ví dụ, nếu ứng dụng ngân hàng có dữ liệu nhạy cảm, cách cô lập khác biệt giữa các ứng dụng sẽ giúp tránh việc một ứng dụng không liên quan truy cập vào dữ liệu đó.
3.2 Độ Tin Cậy Và Ổn Định Cao
Code kernel mặc định là ở mức thấp, nên việc viết code ở đó sẽ khó hơn và có nguy cơ gây lỗi cao hơn. Nếu mọi ứng dụng đều có quyền truy cập đầy đủ, hệ thống sẽ không ổn định do các ứng dụng có thể ứng phó theo cách không xung đột với nhau. Chẳng hạn, nếu hai trình chống virus hoạt động đồng thời, chúng có thể áp dụng các thủ thuật khác nhau và gây ra sự cố cho hệ điều hành.
3.3 Tính Di Động (Portability)
Kernel cung cấp giao diện trừu tượng cho các chức năng phổ biến, cho phép mã trong không gian người dùng đơn giản hơn. Điều này có nghĩa là các phiên bản hệ điều hành mới chỉ cần thực hiện lại các syscall để hỗ trợ toàn bộ chương trình trong không gian người dùng.
3.4 Phân Quyền
Syscall cho phép phân quyền cho người dùng và ứng dụng, giúp chúng có thể thực hiện các hành động nhất định mà không bị can thiệp. Điều này cho phép bạn thiết lập các thư viện bên thứ ba với quyền hạn thấp hơn so với mã phát triển của bạn.
3.5 Giải Quyết Lỗi Và Quản Lý Tài Nguyên
Syscall cung cấp nhiều phương thức kiểm tra lỗi và quản lý tài nguyên trước khi thực hiện thao tác nào đó, giúp ngăn chặn lỗi xảy ra trước khi nó có thể làm hỏng hệ thống.
4. Sử Dụng strace Để Theo Dõi Các Hoạt Động Mở Tệp
Khi lập trình, bạn thường làm việc với tệp tin, đọc từ chúng và thực thi các lệnh. Do đó, việc theo dõi các tệp mà chương trình mở khi chạy là rất quan trọng.
4.1 Trường Hợp Sử Dụng 1: Khởi Động Chương Trình Với strace
Thay vì chạy lệnh:
<command program with args>
Bạn có thể sử dụng strace để theo dõi xem chương trình đã mở các tệp nào, bằng cách sử dụng lệnh:
strace -f -e trace=file [-o logfile] <command program with args>
Giải thích:
-f
có nghĩa là theo dõi cả các tiến trình con được tạo ra.-e trace=file
sẽ chỉ định strace theo dõi các hoạt động liên quan đến tệp.- Thêm
-o <logfile>
để ghi lại kết quả vào tệp log.
Ví dụ: Để theo dõi một script có tên là script.sh
, bạn sử dụng:
strace -f -e trace=file -o bash_strace.log sh script.sh Pictures
Kết quả sẽ cho bạn thấy các hoạt động của script trên các tệp file mà bạn đã chỉ định. Bạn có thể tìm kiếm trong log để xác định các tệp mà chương trình đã thao tác.
4.2 Trường Hợp Sử Dụng 2: Gắn strace Vào Một Tiến Trình Đang Chạy
Nếu bạn muốn theo dõi một chương trình đã chạy mà không thể thay đổi lệnh ban đầu, bạn có thể sử dụng PID của nó để gắn strace vào. Sử dụng lệnh:
pgrep <process_name>
strace -f -e trace=file [-o <log file>] -p <pid>
4.3 Trường Hợp Sử Dụng 3: Theo Dõi Hoạt Động Mạng
Khi bạn gặp phải lỗi trong các chương trình chỉ truy cập Internet như apt update
, bạn có thể thay đổi tham số để theo dõi hoạt động mạng bằng cách thay -e trace=file
thành -e trace=network
. Ví dụ:
strace -f -e trace=network -o pandas.log pip install pandas
Bước này cho phép bạn xác định địa chỉ IP mà chương trình đang cố gắng kết nối, giúp bạn khắc phục lỗi kết nối nếu có.
5. Tóm Tắt
Bài viết đã giải thích chi tiết về strace, syscall và lợi ích của việc tách biệt không gian người dùng và không gian kernel. Bạn đã biết cách theo dõi hoạt động tệp và mạng của các chương trình bên ngoài mà không cần mã nguồn. Trong phần tiếp theo, mình sẽ viết về môi trường Windows. Chúc các bạn thành công trong công việc!
6. Tài Liệu Tham Khảo
6.1 Bảng Tham Khảo Syscall Trên Linux
Xem chi tiết tại: Syscalls Reference
6.2 Tìm Hiểu Thêm Về strace
Xem thêm tại: strace Documentation.
source: viblo