कैसे पता चलेगा कि एक कार्यक्रम लिनक्स में कहां अटक गया है?


44

मैं अपने ubuntu सर्वर पर निम्न कमांड चला रहा हूं

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

यह अनिश्चित काल तक लटका हुआ लगता है। जब भी यह AIX पर हुआ, मैं बस अपमानजनक प्रक्रिया के PID पाने के लिए कहता था और कहता था

$ procstack <pid_of_stuck_process>

और यह प्रक्रिया के पूरे कॉलस्टैक को दिखाता था। क्या procstacklinux / ubuntu में कोई समकक्ष है ?

जवाबों:


43

मेरा पहला कदम प्रक्रिया पर स्ट्रेस चलाना होगा, सबसे अच्छा

 strace -s 99 -ffp 12345

अगर आपकी प्रोसेस आईडी 12345 है। यह आपको दिखाएगा कि प्रोग्राम क्या कर रहा है। कैसे एक प्रक्रिया को स्ट्रेस करना आपको अधिक बताता है।

यदि आप स्टैकट्रेस प्राप्त करने पर जोर देते हैं, तो 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

एक कार्यक्रम के स्टैक ट्रेस को खोजने के लिए दो उत्तर दिए गए हैं (डिबगिंग प्रतीकों को स्थापित करने के लिए याद रखें!)। यदि आप यह पता लगाना चाहते हैं कि सिस्टम कॉल कहाँ अटक गया है, तो जांच करें /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

उस फ़ाइल पर भी ध्यान दें जो सुपरसुसर या प्रक्रिया तक ही सीमित है (कम से कम सिस्टम पर मैंने कोशिश की है)।
स्टीफन चेज़लस

यह भी देखें /proc/pid/wchanऔर WCHANमें स्तंभ ps -lउत्पादन या ps -o wchanकि ढेर के शीर्ष के लिए। ( psभाग कई यूनियनों पर काम करता है, लेकिन हमेशा (अक्सर) अपने आप में उपयोगी नहीं होता है)।
स्टीफन चेज़लस

27

अधिकांश यूनिक्स प्रणालियों पर, आप GDB का उपयोग कर सकते हैं ।

gdb -batch -ex bt -p 1234

वहाँ भी है pstack(एक मानक उपयोगिता नहीं, आपको संभवतः इसे मैन्युअल रूप से स्थापित करना होगा)। यह AIX के बराबर दिखता है procstack। लेकिन मेरे डेबियन 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
पावन मंजुनाथ २०

@PMManjunath pstackको amd64 पर तोड़ा गया लगता है, मैं डेबियन व्हीज़ी amd64 पर उसी का निरीक्षण करता हूं।
गाइल्स 'एसओ- बुराई पर रोक' 21

1
pstack की README का कहना है कि यह केवल 32 बिट, ELF, x86, GNU के लिए है।
स्टीफन चेज़लस

1

pstackआपके लिए एक रनिंग प्रक्रिया का स्टैक ट्रेस प्रिंट करेगा। gstackयदि pstackउपलब्ध नहीं है तो एक सामान्य समतुल्य है / आपके डिस्ट्रो / आर्क का समर्थन नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.