2008-10-06 37 views
223

Một đồng nghiệp đã từng nói với tôi rằng tùy chọn cuối cùng khi mọi thứ không thể gỡ lỗi trên Linux là sử dụng strace.Nên sử dụng strace như thế nào?

Tôi đã cố gắng tìm hiểu khoa học đằng sau công cụ kỳ lạ này, nhưng tôi không phải là chuyên gia quản trị hệ thống và tôi không thực sự nhận được kết quả.

Vì vậy,

  • nó là gì chính xác và nó làm gì?
  • Làm thế nào và trong trường hợp nào nó nên được sử dụng?
  • Làm cách nào để hiểu và xử lý đầu ra?

Tóm tắt, trong các từ đơn giản, công cụ này hoạt động như thế nào?

+1

strace -p sẽ cho bạn biết những gì đang xảy ra ngay bây giờ với chương trình của bạn ..... nhanh chóng và dễ dàng hơn GDB – ernesto

+1

Cá nhân tôi tìm thấy 'man strace' thực sự dễ đọc và hữu ích. (P.S. đã không biết về strace trước ngày hôm qua và không phải là chuyên gia Linux) –

+0

"strace là một hệ thống gọi tracer" - nó chỉ cho bạn thấy những gì các chức năng hạt nhân đang được gọi (với các đối số của họ) như là kết quả của chương trình của bạn. – Pithikos

Trả lời

155

Tổng quan về đường viền
có thể được xem như một trình gỡ lỗi trọng lượng nhẹ. Nó cho phép một lập trình viên/người dùng nhanh chóng tìm ra cách một chương trình tương tác với hệ điều hành. Nó thực hiện điều này bằng cách theo dõi các cuộc gọi và tín hiệu hệ thống.

Sử dụng
Tốt cho khi bạn không có mã nguồn hoặc không muốn bị làm phiền thực sự trải qua nó.
Ngoài ra, hữu ích cho mã của riêng bạn nếu bạn không muốn mở GDB, nhưng chỉ quan tâm đến việc hiểu tương tác bên ngoài.

Một chút giới thiệu tốt
Tôi chạy vào giới thiệu này để strace sử dụng chỉ là ngày khác: strace hello world

+0

Vì vậy, nếu bạn sử dụng một cái gì đó bên dưới lớp mà strace màn hình? – Pacerier

33

danh sách strace tất cả cuộc gọi hệ thống được thực hiện bởi quá trình được áp dụng cho. Nếu bạn không biết các cuộc gọi hệ thống có nghĩa là gì, bạn sẽ không thể nhận được nhiều dặm từ nó. Tuy nhiên, nếu vấn đề của bạn liên quan đến các tệp hoặc đường dẫn hoặc giá trị môi trường, hãy chạy strace trên chương trình có vấn đề và chuyển hướng đầu ra đến tệp và sau đó grepping tệp đó cho đường dẫn/tệp/chuỗi env của bạn có thể giúp bạn xem chương trình của mình là gì là thực sự là đang cố gắng làm, khác với những gì bạn mong đợi.

+6

Và đối với các chương trình không tầm thường, điều này thường giống như uống rượu từ vòi cứu hỏa, vì vậy bạn đã cắt bỏ công việc của mình cho các kết quả ... – dmckee

+17

'strace ' để theo dõi một chương trình. 'strace -o ' để đặt vào một tệp –

+8

strace prog 2> & 1 | grep^open \\ ( – eisbaw

47

Nói cách đơn giản, strace dấu vết tất cả các cuộc gọi hệ thống phát hành bởi một chương trình cùng với mã trở lại của họ. Hãy suy nghĩ những thứ như hoạt động của tệp/ổ cắm và nhiều thao tác ít người biết đến hơn.

Điều này hữu ích nhất nếu bạn có một số kiến ​​thức làm việc về C vì ở đây các cuộc gọi hệ thống sẽ chính xác hơn cho các cuộc gọi thư viện C chuẩn.

Giả sử chương trình của bạn là/usr/local/bin/cough. Đơn giản chỉ cần sử dụng:

strace /usr/local/bin/cough <any required argument for cough here> 

hoặc

strace -o <out_file> /usr/local/bin/cough <any required argument for cough here> 

để viết vào 'out_file'.

Tất cả kết quả đầu ra sẽ chuyển sang chế độ stderr (hãy cẩn thận, khối lượng tuyệt đối của nó thường yêu cầu chuyển hướng đến tệp).Trong những trường hợp đơn giản nhất, chương trình của bạn sẽ hủy bỏ lỗi và bạn sẽ có thể thấy những tương tác cuối cùng của nó với hệ điều hành trong đầu ra strace.

Thông tin thêm nên có sẵn với:

man strace 
+4

+1 cho "cách sử dụng" cho người mới bắt đầu –

2

strace là một công cụ cho bạn biết ứng dụng của bạn tương tác với hệ điều hành của bạn.

Nó thực hiện điều này bằng cách cho bạn biết hệ điều hành nào gọi ứng dụng của bạn sử dụng và với thông số nào nó gọi chúng.

Vì vậy, ví dụ: bạn xem những tệp nào chương trình của bạn cố gắng mở và thời tiết cuộc gọi thành công.

Bạn có thể gỡ lỗi tất cả các loại sự cố với công cụ này. Ví dụ, nếu ứng dụng nói rằng nó không thể tìm thấy thư viện mà bạn biết bạn đã cài đặt bạn strace sẽ cho bạn biết nơi ứng dụng đang tìm kiếm tập tin đó.

Và đó chỉ là một đỉnh của tảng băng trôi.

13

Strace nổi bật như một công cụ để điều tra các hệ thống sản xuất mà bạn không thể đủ khả năng chạy các chương trình này dưới trình gỡ lỗi. Đặc biệt, chúng tôi đã sử dụng strace trong hai trường hợp sau:

  • Chương trình foo có vẻ như bế tắc và không phản hồi. Đây có thể là mục tiêu cho gdb; tuy nhiên, chúng tôi không phải lúc nào cũng có mã nguồn hoặc đôi khi đang xử lý các ngôn ngữ kịch bản mà không phải là tiến thẳng để chạy dưới trình gỡ lỗi. Trong trường hợp này, bạn chạy strace trên một chương trình đang chạy và bạn sẽ nhận được danh sách các cuộc gọi hệ thống đang được thực hiện. Điều này đặc biệt hữu ích nếu bạn đang điều tra ứng dụng khách/máy chủ hoặc ứng dụng tương tác với cơ sở dữ liệu
  • Điều tra lý do chương trình chậm. Đặc biệt, chúng tôi vừa chuyển sang một hệ thống tệp phân tán mới và thông lượng mới của hệ thống rất chậm. Bạn có thể chỉ định strace với tùy chọn '-T' sẽ cho bạn biết lượng thời gian được sử dụng trong mỗi cuộc gọi hệ thống. Điều này giúp xác định lý do tại sao hệ thống tập tin đã gây ra những thứ để làm chậm.

Ví dụ về phân tích sử dụng vạch, hãy xem câu trả lời của tôi cho this question.

4

strace là một công cụ tốt để tìm hiểu cách chương trình của bạn thực hiện các cuộc gọi hệ thống khác nhau (yêu cầu hạt nhân) và cũng báo cáo những lỗi đã thất bại cùng với giá trị lỗi liên quan đến lỗi đó. Không phải tất cả các lỗi đều là lỗi. Ví dụ, một mã đang cố tìm kiếm một tập tin có thể gặp lỗi ENOENT (Không có tệp hoặc thư mục) nhưng đó có thể là một kịch bản chấp nhận được trong logic của mã.

Một trường hợp sử dụng tốt khi sử dụng strace là gỡ lỗi các điều kiện chủng tộc trong quá trình tạo tệp tạm thời. Ví dụ: một chương trình có thể tạo tệp bằng cách gắn thêm ID tiến trình (PID) vào một số chuỗi được xác định trước có thể gặp sự cố trong các trường hợp đa luồng. [Một PID + TID (quá trình id + thread id) hoặc một cuộc gọi hệ thống tốt hơn như mkstemp sẽ sửa lỗi này].

Cũng tốt cho việc gỡ lỗi sự cố. Bạn có thể tìm thấy this (my) article on strace and debugging crashes hữu ích.

5

Strace có thể được sử dụng làm công cụ gỡ lỗi hoặc làm hồ sơ nguyên thủy.

Là trình gỡ lỗi, bạn có thể xem các cuộc gọi hệ thống đã được gọi, được thực hiện như thế nào và những gì chúng trả lại. Điều này rất quan trọng, vì nó cho phép bạn thấy không chỉ một chương trình thất bại, mà còn là một chương trình thất bại.Thông thường nó chỉ là một kết quả của mã hóa tệ hại không bắt tất cả các kết quả có thể có của một chương trình. Lần khác, nó chỉ là đường dẫn mã hóa cứng vào tệp. Nếu không có strace bạn có thể đoán những gì đã đi sai ở đâu và như thế nào. Với strace bạn nhận được một phân tích của một syscall, thường chỉ nhìn vào một giá trị trả lại cho bạn biết rất nhiều.

Hồ sơ là một cách sử dụng khác. Bạn có thể sử dụng nó để thực hiện thời gian của từng syscalls riêng lẻ, hoặc như là một tổng hợp. Mặc dù điều này có thể không đủ để khắc phục sự cố của bạn, nhưng ít nhất cũng sẽ thu hẹp danh sách các nghi phạm tiềm năng. Nếu bạn thấy rất nhiều cặp fopen/close trên một tệp, bạn có thể không cần thiết phải mở và đóng tệp mỗi lần thực thi vòng lặp, thay vì mở và đóng nó bên ngoài vòng lặp.

Ltrace là anh em họ của strace, cũng rất hữu ích. Bạn phải học cách phân biệt nơi cổ chai của bạn. Nếu tổng thời gian thực hiện là 8 giây và bạn chỉ mất 0,05 giây cho các cuộc gọi hệ thống, thì việc truy cập chương trình sẽ không làm bạn tốt, vấn đề nằm trong mã của bạn, thường là vấn đề logic hoặc chương trình thực sự cần mất nhiều thời gian để chạy.

Vấn đề lớn nhất với strace/ltrace là đọc đầu ra của chúng. Nếu bạn không biết làm thế nào các cuộc gọi được thực hiện, hoặc ít nhất là tên của syscalls/chức năng, nó sẽ là khó khăn để decypher ý nghĩa. Việc biết những gì các hàm trả về cũng có thể rất có lợi, đặc biệt đối với các mã lỗi khác nhau. Trong khi đó là một nỗi đau để decypher, đôi khi họ thực sự trở lại một viên ngọc của kiến ​​thức; một khi tôi nhìn thấy một tình huống mà tôi chạy ra khỏi inodes, nhưng không ra khỏi không gian miễn phí, do đó tất cả các tiện ích thông thường đã không cho tôi bất kỳ cảnh báo, tôi chỉ không thể làm cho một tập tin mới. Đọc mã lỗi từ đầu ra của strace chỉ cho tôi đi đúng hướng.

7

strace -tfp PID sẽ theo dõi các cuộc gọi hệ thống của quá trình PID, do đó chúng tôi có thể gỡ lỗi/theo dõi trạng thái chương trình/chương trình của chúng tôi.

10

Tôi sử dụng strace mọi lúc để gỡ lỗi các vấn đề về quyền. Kỹ thuật này giống như sau:

$ strace -e trace=open,stat,read,write gnome-calculator 

Nơi mà lệnh gnome-calculator là lệnh bạn muốn chạy.

Các vấn đề liên quan