আমি কোন চলমান প্রক্রিয়া ডিবাগ করতে জিডিবি ব্যবহার করতে পারি?


উত্তর:


88

হ্যাঁ. attachকমান্ডটি ব্যবহার করুন । পরীক্ষা করে দেখুন এই লিঙ্কে আরও তথ্যের জন্য। help attachজিডিবি কনসোলে টাইপ করা নিম্নলিখিতটি দেয়:

(gdb) help attach

জিডিবির বাইরে কোনও প্রক্রিয়া বা ফাইল সংযুক্ত করুন। এই কমান্ডটি আপনার শেষ targetকমান্ডের মতো একই ধরণের অন্য একটি টার্গেটের সাথে সংযুক্ত থাকে (" info files" আপনার টার্গেটের স্ট্যাক প্রদর্শন করবে)। কমান্ডটি একটি প্রক্রিয়া আইডি, একটি প্রক্রিয়া নাম (প্রত্যয় হিসাবে একটি processচ্ছিক প্রক্রিয়া-আইডি সহ) বা একটি ডিভাইস ফাইল হিসাবে যুক্তি হিসাবে গ্রহণ করতে পারে। একটি প্রক্রিয়া আইডির জন্য, আপনার অবশ্যই প্রক্রিয়াটি একটি সংকেত প্রেরণের অনুমতি থাকতে হবে এবং এটি অবশ্যই ডিবাগারের মতো কার্যকর ইউআইডি থাকা উচিত। attachবিদ্যমান " " প্রক্রিয়াটিতে " " ব্যবহার করার সময়, ডিবাগারটি প্রক্রিয়াটিতে চলমান, বর্তমান কার্যনির্বাহী ডিরেক্টরিতে প্রথমে দেখছেন, বা উত্স ফাইল অনুসন্ধানের পথটি ব্যবহার করে directory"কমান্ডটি দেখুন ") খুঁজে বের করবেন না। আপনি fileপ্রোগ্রামটি নির্দিষ্ট করতে এবং এর প্রতীক টেবিলটি লোড করতে কমান্ডটি " " ব্যবহার করতে পারেন ।


দ্রষ্টব্য: লিনাক্স কার্নেলের উন্নত সুরক্ষার কারণে কোনও প্রক্রিয়া সংযুক্ত করতে আপনার অসুবিধা হতে পারে - উদাহরণস্বরূপ, অন্য শেল থেকে অন্য শেলের সন্তানের সাথে সংযুক্ত হওয়া।

/proc/sys/kernel/yama/ptrace_scopeআপনার প্রয়োজনীয়তার উপর নির্ভর করে আপনাকে সম্ভবত সেট করতে হবে। অনেকগুলি সিস্টেমে এখন ডিফল্ট 1বা তার চেয়ে বেশি উচ্চতর।

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.

8
লিঙ্কটি অসম্পূর্ণ :( আমার দৃষ্টিকোণ থেকে আমি যেমন উত্তর মত এই এক থেকে জে Polfer চিয়ার্স;)।
olibre

আমি লিঙ্কটি ঠিক করেছি।
Attié

এটি কি দূরবর্তী লক্ষ্যবস্তুতে কোনও প্রক্রিয়াটির পিডের জন্যও কাজ করে?
Bionix1441

আপনাকে তখন রিমোট টার্গেটে একটি ডিবাগ সার্ভার চালাতে হবে; তার পরে এটি একই হওয়া উচিত।
কার্ল নরুম

ব্যবহার করে পতাকা পরিবর্তন করা যেতে পারে echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
দাইসুক আরমাকি


24

হ্যাঁ. আপনি করতে পারেন:

gdb program_name program_pid

একটি শর্টকাটটি হবে (ধরে নেওয়া কেবলমাত্র একটি উদাহরণ চলছে):

gdb program_name `pidof program_name`

আমি জানি না এটি কী করে তবে এটি নিশ্চিত যে নরক আমার পক্ষে কাজ করে না। এটি বলে যে <pgram_pid> এর অস্তিত্ব নেই।
আউল

2
আমি দেখতে পেয়েছি যে এটি প্রক্রিয়া সংযুক্তি ছাড়াও প্রতীক টেবিলটি লোড করায় এটি সবচেয়ে ভাল কাজ করে। এটি লক্ষ করা উচিত যে program_nameআপনি বাইনারি হিসাবে একই ডিরেক্টরিতে থাকলে কাজ করে। আমি মনে করি আপনি যদি অন্য ডিরেক্টরিতে থাকেন তবে বাইনারি যাওয়ার কোনও পথ কাজ করবে।
কারাটস্নোম্যাচাইন

-pসামনে ভুলে গেল না program_id? এছাড়াও, চলমান প্রক্রিয়াতে সংযুক্ত করতে sudo দিয়ে gdb চালানো প্রয়োজন হতে পারে।
এমএক্সএমএনএলএনএন 9

15

কমান্ডটি হ'ল gdb attach pidপিড হ'ল যেখানে আপনি সংযুক্ত করতে চান সেই প্রক্রিয়াটির আইডি।


3

হ্যা, তুমি পারো. ধরুন একটি প্রক্রিয়া fooচলছে ...

পিএস-বেলফ | গ্রেপ ফু

পিআইডি নম্বরটি সন্ধান করুন

gdb -a {পিআইডি নম্বর}

5
আপনি কোন বিতরণ চলছে? ফেডোরার সাম্প্রতিক সংস্করণ ব্যবহার করে, 'gdb -a' একটি "বিকল্প -a অস্পষ্ট" ত্রুটি মুদ্রণ করে।
জাস্টিন এথিয়ের

1
সরকারী যুক্তি হ'ল -p / - pid
মাহমুদ আল-কুদসি

3

যদি কেউ কোনও প্রক্রিয়া সংযুক্ত করতে চান তবে এই প্রক্রিয়াটির অবশ্যই একই মালিক হওয়া উচিত। মূলটি যে কোনও প্রক্রিয়াতে সংযুক্ত করতে সক্ষম।


2

পিএস-বেল্ট পিআইডি দেখায় না বলে মনে হচ্ছে। আমি পরিবর্তে ব্যবহার করার পরামর্শ দিচ্ছি:

ps -ld | grep foo
gdb -p PID

2

প্রক্রিয়া আইডি সরবরাহ করা সবচেয়ে সহজ উপায় ।

gdb -p `pidof your_running_program_name`

man gdbকমান্ড বিকল্পের সম্পূর্ণ তালিকা পেতে দয়া করে ।

যদি একই প্রোগ্রামের জন্য একাধিক প্রক্রিয়া চলমান থাকে তবে নিম্নলিখিত কমান্ডটি প্রক্রিয়াগুলি তালিকাভুক্ত করবে।

ps -C program -o pid h
<number>

তারপরে আউটপুট প্রসেস আইডি (নম্বর) জিডিবি-তে আর্গুমেন্ট হিসাবে ব্যবহার করা যেতে পারে।

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