Các chương trình Linux hỏi
Kernel.
[số 8]
để làm một số điều cho họ. Các
strace.
Lệnh tiết lộ các cuộc gọi hệ thống này. Bạn có thể sử dụng chúng để hiểu cách chương trình hoạt động và tại sao, đôi khi, họ không.
Các cuộc gọi kernel và hệ thống
Thông minh như họ có thể, các chương trình máy tính không thể tự làm mọi thứ. Họ cần thực hiện các yêu cầu để có một số chức năng nhất định được thực hiện cho họ. Những yêu cầu này đi đến Kernel Linux. Thông thường, có một thư viện hoặc giao diện phần mềm khác mà chương trình gọi và thư viện sau đó thực hiện yêu cầu thích hợp được gọi là một cuộc gọi hệ thống-vào kernel.
Có thể thấy hệ thống gọi rằng một chương trình đã thực hiện và những phản ứng có thể giúp bạn hiểu được hoạt động bên trong các chương trình mà bạn quan tâm hoặc bạn đã viết. Đây là
Cái gì
strace.
làm
[số 8]
. Nó có thể giúp khắc phục sự cố và tìm kiếm tắc nghẽn.
Các cuộc gọi hệ thống cung cấp tất cả các loại chức năng cấp thấp, chẳng hạn như các hành động đọc và ghi trên các tệp, giết các quy trình, v.v. Có một danh sách hàng trăm cuộc gọi hệ thống trên Trang Man Syscalls [số 8] .
CÓ LIÊN QUAN: Gỡ lỗi với GDB: Bắt đầu [số 8]
Cài đặt strace.
Nếu như
strace.
chưa được cài đặt trên máy tính của bạn, bạn có thể cài đặt nó rất dễ dàng.
Trên Ubuntu, sử dụng lệnh này:
sudo apt cài đặt strace
Trên Fedora, nhập lệnh này:
sudo dnf cài đặt strace
Trên Manjaro, lệnh là:
sudo pacman -sy strace
Bước đầu tiên với Strace
Chúng tôi sẽ sử dụng một chương trình nhỏ để chứng minh
strace.
. Nó không làm gì nhiều: nó sẽ mở một tệp và ghi một dòng văn bản vào đó và nó không có bất kỳ lỗi nào kiểm tra trong đó. Đó chỉ là một hack nhanh chóng để chúng ta có một cái gì đó để sử dụng với
strace.
.
#include & lt; stdio.h & gt;
int Main (int argc, char argv []) {
// Tay cầm tệp
Tập tin * filegeek;
// Mở tệp có tên "strace_demo.txt" hoặc tạo nó
filegeek = fopen ("strace_demo.txt", "W");
// Viết một số văn bản vào tập tin
fprintf (filegeek, "viết nó vào tập tin");
// Đóng tệp
fclose (filegeek);
// Thoát khỏi chương trình
trả lại (0);
} // kết thúc chính
Chúng tôi đã lưu nó vào một tệp có tên là "file-io.c" và biên dịch nó với
GCC.
vào một thực thi được gọi là
Stex.
, Đặt tên cho "
NS
cuộc đua
Ví dụ
Phong phú."
GCC -O STEX File-io.c
Chúng tôi sẽ gọi
strace.
Từ dòng lệnh và chuyển tên mới của chúng ta thực thi sang đó là quy trình mà chúng ta muốn truy tìm theo dõi. Chúng tôi có thể dễ dàng theo dõi bất kỳ lệnh linux nào hoặc bất kỳ tệp thực thi nhị phân nào khác. Chúng tôi đang sử dụng chương trình nhỏ bé của chúng tôi vì hai lý do.
Lý do đầu tiên là
strace.
là dài dòng. Có thể có rất nhiều sản lượng. Thật tuyệt khi bạn đang sử dụng
strace.
Trong sự tức giận, lúc đầu nó có thể quá sức. Có giới hạn
strace.
đầu ra cho chương trình nhỏ của chúng tôi. Lý do thứ hai là chương trình của chúng tôi có chức năng hạn chế và mã nguồn ngắn và đơn giản. Điều này giúp dễ dàng xác định phần nào của đầu ra đề cập đến các phần khác nhau của hoạt động nội bộ của chương trình.
Strace ./stex
Chúng ta có thể thấy rõ
viết
Gọi hệ thống Gửi văn bản "Viết nó vào tệp" vào tệp đã mở của chúng tôi và
exit_group.
Gọi hệ thống. Điều này chấm dứt tất cả các chủ đề trong ứng dụng và gửi một giá trị trả về trở lại shell.
Lọc đầu ra
Ngay cả với chương trình trình diễn đơn giản của chúng tôi, có khá nhiều đầu ra. Chúng ta có thể sử dụng
-pe.
(biểu thức) tùy chọn. Chúng tôi sẽ chuyển vào tên của cuộc gọi hệ thống mà chúng tôi muốn xem.
Strace -e viết ./stex
Bạn có thể báo cáo về nhiều cuộc gọi hệ thống bằng cách thêm chúng dưới dạng danh sách được phân tách bằng dấu phẩy. Không bao gồm bất kỳ khoảng trắng nào trong danh sách các cuộc gọi hệ thống.
Strace -e Đóng, viết ./stex
Gửi đầu ra đến một tập tin
Lợi ích của việc lọc đầu ra cũng là vấn đề với việc lọc đầu ra. Bạn thấy những gì bạn yêu cầu để xem, nhưng bạn không thấy gì khác. Và một số sản lượng khác có thể hữu ích hơn với bạn so với những thứ bạn yêu cầu xem.
Đôi khi, nó thuận tiện hơn để chụp mọi thứ và tìm kiếm và cuộn qua toàn bộ kết quả. Bằng cách đó, bạn sẽ không vô tình loại trừ bất cứ điều gì quan trọng. Các
-
(đầu ra) Tùy chọn cho phép bạn gửi đầu ra từ một
strace.
phiên vào một tập tin văn bản.
Strace -o Trace-Output.txt ./stex
Sau đó, bạn có thể
sử dụng
ít hơn
chỉ huy
[số 8]
Để cuộn qua danh sách và tìm kiếm các cuộc gọi hệ thống, hoặc bất cứ điều gì khác theo tên.
Ít Trace-Expution.txt
Bây giờ bạn có thể sử dụng tất cả
ít hơn
Khả năng tìm kiếm của Search để điều tra đầu ra.
CÓ LIÊN QUAN: Cách sử dụng Lệnh ít hơn trên Linux [số 8]
Thêm dấu thời gian
Bạn có thể thêm một số dấu thời gian khác nhau vào đầu ra. Các
-NS
Tùy chọn (Dấu thời gian tương đối) Tùy chọn thêm dấu thời gian cho thấy sự khác biệt về thời gian giữa sự bắt đầu của mỗi cuộc gọi hệ thống liên tiếp. Lưu ý rằng các giá trị thời gian này sẽ bao gồm thời gian dành cho cuộc gọi hệ thống trước đó và bất cứ điều gì khác mà chương trình đang hoạt động trước cuộc gọi hệ thống tiếp theo.
Strace -r ./stex
Các dấu thời gian được hiển thị ở đầu của mỗi dòng đầu ra.
Để xem lượng thời gian dành cho mỗi cuộc gọi hệ thống, hãy sử dụng
-NS
(Syscall-Times) tùy chọn. Điều này cho thấy thời gian thời gian dành cho mỗi cuộc gọi hệ thống.
Strace -t ./stex
Thời gian thời gian được hiển thị ở cuối mỗi dòng gọi hệ thống.
Để xem thời gian mà mỗi cuộc gọi hệ thống được gọi, sử dụng
-tà
(dấu thời gian tuyệt đối) tùy chọn. Điều này cho thấy "đồng hồ treo tường" thời gian, với độ phân giải micro giây.
Strace -tt ./stex
Thời gian được hiển thị ở đầu mỗi dòng.
Truy tìm một quá trình đang chạy
Nếu quá trình mà bạn muốn theo dõi đã chạy, bạn vẫn có thể đính kèm
strace.
đến nó. Để làm như vậy, bạn cần biết ID tiến trình. Bạn có thể
sử dụng
trước
[số 8]
với
grep.
[số 8]
Để tìm điều này. Chúng tôi có Firefox đang chạy. Để tìm ra id của
Firefox.
quá trình, chúng ta có thể sử dụng
trước
và
Ống nó thông qua
grep.
.
[số 8]
PS -E | grep firefox
Chúng ta có thể thấy rằng ID tiến trình là 8483. Chúng tôi sẽ sử dụng
-P
(ID quy trình) tùy chọn để nói
strace.
quy trình nào để gắn vào. Lưu ý rằng bạn sẽ cần sử dụng
sudo.
:
sudo strace -p 8483
Bạn sẽ thấy một thông báo rằng
strace.
đã đính kèm chính mình vào quy trình, và sau đó các cuộc gọi theo dõi hệ thống sẽ được hiển thị trong cửa sổ Terminal như bình thường.
Tạo một báo cáo
Các
-NS
(chỉ tóm tắt) tùy chọn nguyên nhân
strace.
để in một báo cáo. Nó tạo ra một bảng để biết thông tin về các cuộc gọi hệ thống được thực hiện bởi chương trình theo dõi.
Strace -c ./stex
Các cột là:
- % thời gian : Tỷ lệ thời gian thực hiện đã được sử dụng trong mỗi cuộc gọi hệ thống.
- giây : Tổng thời gian biểu thị bằng giây và micro giây dành cho mỗi cuộc gọi hệ thống.
- USECS / Call. : Thời gian trung bình trong micro giây dành cho mỗi cuộc gọi hệ thống.
- gọi : Số lần mà mỗi cuộc gọi hệ thống được thực thi.
- Lỗi : Số lần thất bại cho mỗi cuộc gọi hệ thống.
- SYSCALL. : Tên của cuộc gọi hệ thống.
Các giá trị này sẽ hiển thị các số 0 cho các chương trình tầm thường thực hiện và chấm dứt nhanh chóng. Các giá trị trong thế giới thực được hiển thị cho các chương trình làm một cái gì đó có ý nghĩa hơn ứng dụng trình diễn của chúng tôi.
Những hiểu biết sâu sắc, dễ dàng
Các
strace.
Đầu ra có thể cho bạn thấy những cuộc gọi hệ thống đang được thực hiện, những cuộc gọi nào đang được thực hiện nhiều lần và thời gian thực hiện được sử dụng trong mã bên kernel. Đó là thông tin tuyệt vời. Thông thường, khi bạn đang cố gắng hiểu những gì đang diễn ra trong mã của mình, thật dễ dàng để quên rằng nhị phân của bạn đang tương tác gần như không ngừng hoạt động với kernel để thực hiện nhiều chức năng của nó.
Bằng cách sử dụng
strace.
, bạn thấy bức tranh hoàn chỉnh.