একটি প্রোগ্রাম যেখানে লিনাক্স আটকে আছে কিভাবে জানবেন?


44

আমি আমার উবুন্টু সার্ভারে নিম্নলিখিত কমান্ডটি চালাচ্ছি

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

মনে হয় এটি অনির্দিষ্টকালের জন্য ঝুলে আছে। যখনই এআইএক্স এ ঘটেছিল, আমি কেবল আপত্তিজনক প্রক্রিয়াটির পিআইডি পেয়ে বলতাম

$ procstack <pid_of_stuck_process>

এবং এটি প্রক্রিয়াটির পুরো কলস্ট্যাকটি দেখাত। procstackলিনাক্স / উবুন্টু এর সমতুল্য কি আছে ?

উত্তর:


43

আমার প্রথম পদক্ষেপটি হবে প্রক্রিয়াটির উপর স্ট্রেস চালানো, সেরা

 strace -s 99 -ffp 12345

যদি আপনার প্রসেস আইডি 12345 হয় This এটি আপনাকে প্রোগ্রামটি করছে এমন সমস্ত সিস্টেমে দেখায়। কীভাবে কোনও প্রক্রিয়াটি স্ট্রেস করা যায় তা আপনাকে আরও বলে।

আপনি যদি স্ট্যাকট্র্যাস নেওয়ার জন্য জেদ করেন তবে গুগল আমাকে সমতুল্য পিস্ট্যাক বলে। তবে এটি ইনস্টল না করে আমি জিডিবি ব্যবহার করি:

 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] / স্ট্যাক (লিনাক্স 2.6.29 যেহেতু) এই ফাইলটিতে ফাংশন কলগুলির একটি প্রতীকী চিহ্ন সরবরাহ করে এই প্রক্রিয়াটির কার্নেল স্ট্যাক This এই ফাইলটি কেবল তখনই সরবরাহ করা হয় যদি কার্নেলটি CONFIG_STACKTRACE কনফিগারেশন বিকল্পের সাথে নির্মিত হয় ""
ডকসালভেজার

এছাড়াও নোট করুন যে ফাইলটিতে অ্যাক্সেস কেবল সুপারইজার বা নিজেই প্রক্রিয়াতেই সীমাবদ্ধ (কমপক্ষে আমি যে সিস্টেমে চেষ্টা করেছি সেগুলিতে)।
স্টাফেন চেজেলাস

আরও দেখুন /proc/pid/wchanএবং WCHANকলাম ps -lআউটপুট বা ps -o wchanযে স্ট্যাকের উপরের জন্য। ( psঅংশটি অনেক ইউনিয়নে কাজ করে তবে সর্বদা (প্রায়শই) নিজেরাই কার্যকর হয় না)।
স্টাফেন চেজেলাস

27

বেশিরভাগ ইউনিক্স সিস্টেমে আপনি জিডিবি ব্যবহার করতে পারেন ।

gdb -batch -ex bt -p 1234

এছাড়াও রয়েছে pstack(কোনও মানক ইউটিলিটি নয়, আপনাকে সম্ভবত এটি ম্যানুয়ালি ইনস্টল করতে হবে)। এটি এআইএক্স এর সমতুল্য বলে মনে হচ্ছে procstack। তবে আমার ডেবিয়ান হুইজি এএমডি on64 এ, এটি সর্বদা ত্রুটিযুক্ত বলে মনে হচ্ছে। আই 386-তে, ডিবাগিং প্রতীক ছাড়াই সংকলিত একটি প্রোগ্রামের জন্য, এটি কোনও চিহ্ন মুদ্রণ করে না, এমনকি লাইব্রেরি থেকেও নয়, যার জন্য ডিবাগিং প্রতীকগুলি পাওয়া যায়।

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
এমনই

@ পাভান মঞ্জুনাথ এমডি 64৪ pstackতে ভাঙ্গা মনে হচ্ছে, আমি ডেবিয়ান হুইজি এএমডি on৪ তেও এটি পালন করি।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

1
pstack এর README বলে যে এটি কেবল 32 বিট, ইএলএফ, x86, জিএনইউর জন্য।
স্টাফেন চেজেলাস

1

pstackআপনার জন্য একটি চলমান প্রক্রিয়া স্ট্যাক ট্রেস মুদ্রণ করবে। gstackযদি pstackউপলব্ধ না থাকে / আপনার ডিস্ট্রো / খিলানকে সমর্থন করে না তবে এটি একটি সাধারণ সমতুল্য ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.