Làm thế nào để biết nơi một chương trình bị mắc kẹt trong linux?


44

Tôi đang chạy lệnh sau trên máy chủ Ubuntu của tôi

root@slot13:~# lxc-stop --name pavan --logfile=test1.txt --logpriority=trace

Nó dường như treo vô thời hạn. Bất cứ khi nào điều này xảy ra trên AIX, tôi chỉ đơn giản là sử dụng để có được quy trình vi phạm và nói

$ procstack <pid_of_stuck_process>

và nó được sử dụng để hiển thị toàn bộ Callstack của quá trình. Có bất kỳ tương đương với procstacktrong linux / ubfox không?

Câu trả lời:


43

Bước đầu tiên của tôi sẽ là chạy strace trên tiến trình, tốt nhất

 strace -s 99 -ffp 12345

nếu ID tiến trình của bạn là 12345. Điều này sẽ cho bạn thấy tất cả các tòa nhà mà chương trình đang thực hiện. Làm thế nào để sải bước một quá trình cho bạn biết nhiều hơn.

Nếu bạn khăng khăng muốn có một stacktrace, google sẽ cho tôi biết tương đương là pstack. Nhưng vì tôi chưa cài đặt nên tôi sử dụng gdb:

 tweedleburg:~ # sleep 3600 &
 [2] 2621
 tweedleburg:~ # gdb
 (gdb) attach 2621
 (gdb) bt
 #0  0x00007feda374e6b0 in __nanosleep_nocancel () from /lib64/libc.so.6
 #1  0x0000000000403ee7 in ?? ()
 #2  0x0000000000403d70 in ?? ()
 #3  0x000000000040185d in ?? ()
 #4  0x00007feda36b8b05 in __libc_start_main () from /lib64/libc.so.6
 #5  0x0000000000401969 in ?? ()
 (gdb)

33

Hai câu trả lời đã được đưa ra để tìm dấu vết ngăn xếp của một chương trình (hãy nhớ cài đặt các biểu tượng gỡ lỗi trước!). Nếu bạn muốn tìm ra nơi một cuộc gọi hệ thống bị kẹt, hãy kiểm tra /proc/PID/stack, trong đó liệt kê ngăn xếp kernel. Thí dụ:

$ cat /proc/self/stack
[<ffffffff81012b72>] save_stack_trace_tsk+0x22/0x40
[<ffffffff81213abe>] proc_pid_stack+0x8e/0xe0
[<ffffffff81214960>] proc_single_show+0x50/0x90
[<ffffffff811cd970>] seq_read+0xe0/0x3e0
[<ffffffff811a6a84>] vfs_read+0x94/0x180
[<ffffffff811a7729>] SyS_read+0x49/0xb0
[<ffffffff81623ad2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

6
LƯU Ý: per man7.org/linux/man-pages/man5/proc.5.html ... "/ Proc / [pid] / stack (kể từ Linux 2.6,29) Tệp này cung cấp một dấu vết tượng trưng của các lệnh gọi hàm trong ngăn xếp hạt nhân của quá trình này. Tệp này chỉ được cung cấp nếu kernel được xây dựng với tùy chọn cấu hình CONFIG_STACKTRACE. "
DocSalvager

Cũng lưu ý quyền truy cập vào tệp đó được giới hạn ở siêu người dùng hoặc chính quá trình (ít nhất là trên các hệ thống tôi đã thử).
Stéphane Chazelas

Xem thêm /proc/pid/wchanWCHANcột trong ps -lđầu ra hoặc ps -o wchancho đầu ngăn xếp đó. ( psphần này hoạt động trên nhiều Thông báo, nhưng bản thân nó không phải lúc nào cũng hữu ích (thường).
Stéphane Chazelas

27

Trên hầu hết các hệ thống unix, bạn có thể sử dụng GDB .

gdb -batch -ex bt -p 1234

Ngoài ra còn có pstack(không phải là một tiện ích tiêu chuẩn, có lẽ bạn sẽ phải cài đặt nó bằng tay). Nó trông giống như của AIX procstack. Nhưng trên Debian wheezy amd64 của tôi, nó dường như luôn bị lỗi. Trên i386, đối với một chương trình được biên dịch mà không gỡ lỗi các ký hiệu, nó không in bất kỳ ký hiệu nào, thậm chí từ các thư viện có các ký hiệu gỡ lỗi có sẵn.

Bạn cũng có thể sử dụng strace -p1234để xem các cuộc gọi hệ thống được thực hiện theo quy trình.


1
pstackdường như đang ném lỗi mọi lúc. Một cái gì đó giống nhưroot@sarai:~# pstack 6312 6312: /usr/bin/python /usr/bin/twistd -n --uid=maas --gid=maas --pidfile=/run/maas-pserv.pid --logfile=/dev/null maas-pserv --conf... (No symbols found) crawl: Input/output error Error tracing through process 6312
Pavan Manjunath

@PavanManjunath pstackdường như bị phá vỡ trên amd64, tôi quan sát tương tự trên Debian wheezy amd64.
Gilles 'SO- ngừng trở nên xấu xa'

1
README của pstack nói rằng nó chỉ dành cho 32 bit, ELF, x86, GNU.
Stéphane Chazelas

1

pstacksẽ in một dấu vết ngăn xếp của một quá trình đang chạy cho bạn. gstacklà một tương đương phổ biến nếu pstackkhông có sẵn / không hỗ trợ distro / arch của bạn.

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.