จะทราบได้อย่างไรว่าโปรแกรมติดอยู่ใน linux?


44

ฉันใช้คำสั่งต่อไปนี้บนเซิร์ฟเวอร์ ubuntu ของฉัน

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

ดูเหมือนว่าจะแขวนไปเรื่อย ๆ เมื่อใดก็ตามที่สิ่งนี้เกิดขึ้นบน AIX ฉันก็แค่รับ PID ของกระบวนการที่ละเมิดและพูด

$ procstack <pid_of_stuck_process>

และมันใช้เพื่อแสดง callstack ทั้งหมดของกระบวนการ procstackใน linux / ubuntu นั้นเทียบเท่ากับอะไรบ้าง?

คำตอบ:


43

ขั้นตอนแรกของฉันคือเรียกใช้ strace ในกระบวนการที่ดีที่สุด

 strace -s 99 -ffp 12345

ถ้า ID กระบวนการของคุณคือ 12345 ซึ่งจะแสดงให้คุณเห็น syscalls ทั้งหมดที่โปรแกรมกำลังทำอยู่ วิธี strace กระบวนการจะบอกคุณมากขึ้น

หากคุณยืนยันที่จะได้รับ stacktrace, google บอกฉันเทียบเท่า pstack แต่เนื่องจากฉันไม่ได้ติดตั้งฉันใช้ 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

ได้รับคำตอบสองข้อสำหรับการค้นหา stack trace ของโปรแกรม (อย่าลืมติดตั้งสัญลักษณ์การดีบักก่อน!) หากคุณต้องการทราบว่าการโทรของระบบติดอยู่ที่ใดให้ตรวจสอบ/proc/PID/stackซึ่งแสดงรายการสแตกเคอร์เนล ตัวอย่าง:

$ 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
หมายเหตุ: ต่อman7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (ตั้งแต่ Linux 2.6.29) ไฟล์นี้มีการติดตามสัญลักษณ์ของการเรียกใช้ฟังก์ชันใน เคอร์เนลของกระบวนการนี้ไฟล์นี้มีให้เฉพาะในกรณีที่เคอร์เนลถูกสร้างขึ้นด้วยตัวเลือกการกำหนดค่า CONFIG_STACKTRACE "
DocSalvager

การเข้าถึงไฟล์นั้น จำกัด เพียง superuser หรือกระบวนการเอง (อย่างน้อยในระบบที่ฉันได้ลอง)
Stéphane Chazelas

ดูเพิ่มเติม/proc/pid/wchanและWCHANคอลัมน์ในps -lเอาต์พุตหรือps -o wchanด้านบนของสแต็กนั้น ( psส่วนหนึ่งทำงานได้กับ Unices จำนวนมาก แต่ไม่ได้มีประโยชน์เสมอไปในตัวมันเอง)
Stéphane Chazelas

27

บนระบบ UNIX ส่วนใหญ่คุณสามารถใช้GDB

gdb -batch -ex bt -p 1234

นอกจากนี้ยังมีpstack(ไม่ใช่ยูทิลิตี้มาตรฐานคุณอาจต้องติดตั้งด้วยตนเอง) ดูเหมือนว่าเทียบเท่า procstackAIX แต่ใน Debian wheezy amd64 ของฉันดูเหมือนว่าจะผิดพลาดเสมอ บน i386 สำหรับโปรแกรมที่คอมไพล์โดยไม่มีสัญลักษณ์การดีบั๊กมันไม่ได้พิมพ์สัญลักษณ์ใด ๆ แม้แต่จากไลบรารี่ที่มีสัญลักษณ์การดีบั๊กอยู่

คุณยังสามารถใช้strace -p1234เพื่อดูการเรียกระบบที่ดำเนินการโดยกระบวนการ


1
pstackดูเหมือนว่าจะโยนข้อผิดพลาดทุกครั้ง บางอย่างเช่น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 pstackดูเหมือนว่าจะเสียใน amd64 ฉันสังเกตเหมือนกันใน Debian wheezy amd64
Gilles 'หยุดชั่วร้าย'

1
README ของ pstackบอกว่ามันเป็นเพียง 32 บิต, ELF, x86, GNU
Stéphane Chazelas

1

pstackจะพิมพ์การติดตามสแต็กของกระบวนการทำงานสำหรับคุณ gstackเป็นสิ่งที่เทียบเท่ากันโดยทั่วไปหากpstackไม่สามารถใช้ได้ / ไม่สนับสนุน distro / arch ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.