Làm thế nào để xác định hướng dẫn nào một quy trình đang thực hiện?


8

Tôi biết về strace và ltrace, nhưng điều đó chỉ cho tôi biết những gì hệ thống gọi và thư viện gọi một quy trình đang thực hiện, tương ứng. Tôi muốn biết chính xác những gì một quy trình đang thực hiện. Hoặc là lắp ráp, hoặc một số loại trung gian giữa C và lắp ráp nếu có thể. Giả sử nhị phân chưa được biên dịch với các ký hiệu gỡ lỗi, nên nghiêng về tùy chọn đầu tiên càng nhiều khả năng.

Trường hợp sử dụng: quá trình dường như được treo, không có đầu ra từ strace hoặc ltrace. Xác định nếu quá trình đang làm "một cái gì đó". Tôi nhận ra điều này có thể khó xác định, vì tôi tưởng tượng điều này tương tự như giải quyết vấn đề tạm dừng. Tuy nhiên, có thể thu thập dữ liệu hữu ích.

Trường hợp sử dụng thứ hai: sự tò mò. Sẽ rất thú vị khi kết xuất toàn bộ danh sách các hướng dẫn lắp ráp vào một danh sách văn bản.

Tôi đoán là tôi có thể sử dụng gdb để làm điều này, nhưng không biết làm thế nào, vì điều này ít về việc gỡ lỗi một chương trình tôi đã viết và nhiều hơn về việc sử dụng gdb để kiểm tra sức khỏe của một quy trình đang chạy.

HĐH là CentOS 6.


Tôi khá chắc chắn rằng bạn có thể gỡ lỗi quá trình của bạn trong thực thi với gdbhoặc ddd. Ngay cả trong lắp ráp, và không có biểu tượng gỡ lỗi.
Valmiky Arquissandas

Câu trả lời:


10

Bạn có thể làm điều này với gdb: các lệnh nisichạy một lệnh duy nhất tại một thời điểm. Lệnh nchạy dòng mã tiếp theo, đối với hầu hết các giá trị của "tiếp theo". Đối với n(và tương ứng s), bạn phải biên dịch sao cho các biểu tượng gỡ lỗi xuất hiện trong tệp thực thi.

Câu trả lời stackoverflow này cung cấp cho một vài phương pháp để thực hiện điều này ít nhiều trực quan.

Các gdblệnh: display/i $pcshow cho bạn những hướng dẫn trước khi nó được thực thi. display $pchiển thị dòng mã bfor nhoặc sthực thi nó.


Sử dụng gdb -p <pid>để gắn vào quá trình.
Ángel

6

Chạy ps -ltrên ID tiến trình và kiểm tra cột S(trạng thái trực tuyến). Nếu trạng thái là R, thì quá trình của bạn đang thực thi mã. Nếu quy trình vẫn ở trạng thái Rstracekhông hiển thị nó thực hiện bất kỳ cuộc gọi hệ thống nào, thì quá trình đó bị kẹt trong một tính toán rất dài, có thể là vô hạn. Nếu quá trình này vẫn ở trạng thái D, thì nó sẽ bị chặn trong một cuộc gọi hệ thống. Để biết thêm thông tin về trạng thái quá trình, xem STAT quá trình này chỉ ra điều gì? , Trạng thái "giấc ngủ gián đoạn" biểu thị điều gì? nếu 'kill -9' không hoạt động thì sao? .

Nếu quy trình đang chạy một tính toán dài, bạn có thể sử dụng Gdb (hoặc trình gỡ lỗi khác) để xem những gì nó đang làm. Nếu tệp thực thi thiếu thông tin gỡ lỗi (thường là trường hợp nếu bạn không biên dịch chương trình đặc biệt cho điều đó), thì trình gỡ lỗi sẽ chỉ có thể hiển thị cho bạn các hướng dẫn máy; nếu tệp thực thi chứa thông tin gỡ lỗi, bạn sẽ có thể thấy tên của các hàm trong dấu vết ngăn xếp, v.v. Để đính kèm gdb để quá trình này, chạy gdb /path/to/executable 1234nơi 1234là quá trình ID. Lệnh scho phép bạn thực hiện từng lệnh một. Trừ khi bạn là một lập trình viên và có phần quen thuộc với những gì chương trình dự định sẽ làm, ít có khả năng bạn sẽ nhận được thông tin hữu ích từ Gdb trong kịch bản này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.