ฉันสามารถใช้ GDB เพื่อดีบักกระบวนการที่กำลังทำงานอยู่ได้หรือไม่


คำตอบ:


88

ใช่. ใช้attachคำสั่ง ตรวจสอบลิงค์นี้สำหรับข้อมูลเพิ่มเติม การพิมพ์help attachที่คอนโซล GDB ให้สิ่งต่อไปนี้:

(gdb) help attach

แนบกับกระบวนการหรือไฟล์ภายนอก GDB คำสั่งนี้เชื่อมโยงกับเป้าหมายอื่นประเภทเดียวกับtargetคำสั่ง " " สุดท้ายของคุณ(" info files" จะแสดงสแต็กเป้าหมายของคุณ) คำสั่งอาจใช้เป็นอาร์กิวเมนต์ id กระบวนการชื่อกระบวนการ (โดยมีรหัสกระบวนการที่เป็นทางเลือกเป็นคำต่อท้าย) หรือไฟล์อุปกรณ์ สำหรับรหัสกระบวนการคุณต้องได้รับอนุญาตให้ส่งสัญญาณกระบวนการและต้องมี uid ที่มีประสิทธิภาพเช่นเดียวกับตัวดีบักเกอร์ เมื่อใช้ " attach" กับกระบวนการที่มีอยู่ดีบักเกอร์จะค้นหาโปรแกรมที่กำลังทำงานอยู่ในกระบวนการโดยค้นหาก่อนในไดเร็กทอรีการทำงานปัจจุบันหรือ (หากไม่พบที่นั่น) โดยใช้เส้นทางการค้นหาไฟล์ต้นทาง (ดูdirectoryคำสั่ง "") คุณยังสามารถใช้fileคำสั่ง "" เพื่อระบุโปรแกรมและโหลดตารางสัญลักษณ์


หมายเหตุ: คุณอาจมีปัญหาในการเชื่อมต่อกับกระบวนการเนื่องจากการรักษาความปลอดภัยที่ดีขึ้นในเคอร์เนล Linux - ตัวอย่างเช่นการแนบกับชายด์ของเชลล์หนึ่งจากอีกเชลล์

คุณอาจต้องตั้งค่า/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
ลิงค์เสีย :( จากมุมมองของฉันฉันชอบคำตอบเช่นนี้จากJ. Polfer Cheers;)
olibre

ฉันได้แก้ไขลิงค์แล้ว
Attie

สิ่งนี้ใช้ได้กับ pid ของกระบวนการบนเป้าหมายระยะไกลหรือไม่?
Bionix1441

คุณต้องรันเซิร์ฟเวอร์ดีบักบนเป้าหมายระยะไกลจากนั้น หลังจากนั้นก็ควรจะเหมือนเดิม
Carl Norum

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scopeธงอาจมีการเปลี่ยนแปลงโดยใช้
Daisuke Aramaki


24

ใช่. คุณทำได้:

gdb program_name program_pid

ทางลัดจะเป็น (สมมติว่ามีเพียงอินสแตนซ์เดียวเท่านั้นที่กำลังทำงานอยู่):

gdb program_name `pidof program_name`

ฉันไม่รู้ว่ามันทำอะไรได้ แต่แน่ใจว่านรกไม่ได้ผลสำหรับฉัน มันบอกว่าไม่มี <program_pid>
นกฮูก

2
ฉันพบว่าสิ่งนี้ได้ผลดีที่สุดเมื่อโหลดตารางสัญลักษณ์นอกเหนือจากการแนบไปกับกระบวนการ ควรสังเกตว่าใช้program_nameงานได้ถ้าคุณอยู่ในไดเร็กทอรีเดียวกับไบนารี ฉันคิดว่าเส้นทางไปยังไบนารีจะใช้ได้ถ้าคุณอยู่ในไดเรกทอรีอื่น
KarateSnowMachine

คุณไม่ลืมที่-pอยู่ตรงหน้าprogram_id? นอกจากนี้อาจจำเป็นต้องรัน gdb ด้วย sudo เพื่อเชื่อมต่อกับกระบวนการที่กำลังทำงานอยู่
mxmlnkn


3

ใช่คุณสามารถ. สมมติว่ากระบวนการfooทำงาน ...

ps -elf | grep foo

มองหาหมายเลข PID

gdb -a {หมายเลข PID}

5
คุณกำลังดำเนินการแจกจ่ายอะไร เมื่อใช้ Fedora เวอร์ชันล่าสุด "gdb -a" จะพิมพ์ข้อผิดพลาด "option -a is ambiguous"
Justin Ethier

1
ข้อโต้แย้งอย่างเป็นทางการคือ -p / - pid
Mahmoud Al-Qudsi



2

วิธีที่ง่ายที่สุดคือการให้กระบวนการ id

gdb -p `pidof your_running_program_name`

โปรดรับรายการตัวเลือกทั้งหมดในman gdbคำสั่ง

ในกรณีที่มีหลายกระบวนการสำหรับโปรแกรมเดียวกันที่ทำงานอยู่คำสั่งต่อไปนี้จะแสดงรายการกระบวนการ

ps -C program -o pid h
<number>

จากนั้นรหัสกระบวนการผลลัพธ์(หมายเลข) สามารถใช้เป็นอาร์กิวเมนต์ของ gdb

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