ภายใต้ linux ฉันสามารถใช้ GDB เพื่อดีบักกระบวนการที่กำลังทำงานอยู่ได้หรือไม่
ภายใต้ linux ฉันสามารถใช้ GDB เพื่อดีบักกระบวนการที่กำลังทำงานอยู่ได้หรือไม่
คำตอบ:
ใช่. ใช้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.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
ธงอาจมีการเปลี่ยนแปลงโดยใช้
คุณสามารถแนบไปกับกระบวนการทำงานด้วยgdb -p PID
ไฟล์.
ใช่. คุณทำได้:
gdb program_name program_pid
ทางลัดจะเป็น (สมมติว่ามีเพียงอินสแตนซ์เดียวเท่านั้นที่กำลังทำงานอยู่):
gdb program_name `pidof program_name`
program_name
งานได้ถ้าคุณอยู่ในไดเร็กทอรีเดียวกับไบนารี ฉันคิดว่าเส้นทางไปยังไบนารีจะใช้ได้ถ้าคุณอยู่ในไดเรกทอรีอื่น
-p
อยู่ตรงหน้าprogram_id
? นอกจากนี้อาจจำเป็นต้องรัน gdb ด้วย sudo เพื่อเชื่อมต่อกับกระบวนการที่กำลังทำงานอยู่
คำสั่งที่จะใช้คือgdb attach pid
โดยที่ pid คือรหัสกระบวนการของกระบวนการที่คุณต้องการแนบ
ใช่คุณสามารถ. สมมติว่ากระบวนการfoo
ทำงาน ...
ps -elf | grep foo มองหาหมายเลข PID gdb -a {หมายเลข PID}
หากต้องการแนบกระบวนการกระบวนการนี้ต้องมีเจ้าของคนเดียวกัน รากสามารถเชื่อมต่อกับกระบวนการใดก็ได้
ps -elf ดูเหมือนจะไม่แสดง PID ฉันแนะนำให้ใช้แทน:
ps -ld | grep foo
gdb -p PID
วิธีที่ง่ายที่สุดคือการให้กระบวนการ id
gdb -p `pidof your_running_program_name`
โปรดรับรายการตัวเลือกทั้งหมดในman gdb
คำสั่ง
ในกรณีที่มีหลายกระบวนการสำหรับโปรแกรมเดียวกันที่ทำงานอยู่คำสั่งต่อไปนี้จะแสดงรายการกระบวนการ
ps -C program -o pid h
<number>
จากนั้นรหัสกระบวนการผลลัพธ์(หมายเลข) สามารถใช้เป็นอาร์กิวเมนต์ของ gdb
gdb -p <process id>