คำถามติดแท็ก gdb

ใช้แท็กนี้สำหรับปัญหาที่เกี่ยวข้องหรือเกี่ยวข้องกับ GDB ซึ่งเป็นดีบักเกอร์มาตรฐานสำหรับระบบซอฟต์แวร์ GNU

4
GDB: แบ่งถ้าตัวแปรเท่ากับค่า
ฉันต้องการให้ GDB กำหนดจุดพักเมื่อตัวแปรเท่ากับค่าที่ฉันตั้งไว้ฉันลองใช้ตัวอย่างนี้: #include <stdio.h> main() { int i = 0; for(i=0;i<7;++i) printf("%d\n", i); return 0; } ผลลัพธ์จาก GDB: (gdb) break if ((int)i == 5) No default breakpoint address now. (gdb) run Starting program: /home/SIFE/run 0 1 2 3 4 5 6 Program exited normally. (gdb) อย่างที่คุณเห็น GDB ไม่ได้สร้างจุดแตกหักเป็นไปได้ด้วย GDB …
91 c  gdb 

3
การใช้ gdb กับโค้ดแอสเซมบลีขั้นตอนเดียวที่นอกเหนือจากปฏิบัติการที่ระบุทำให้เกิดข้อผิดพลาด“ ไม่พบขอบเขตของฟังก์ชันปัจจุบัน”
ฉันอยู่นอกเป้าหมายปฏิบัติการของ gdb และฉันไม่มีสแต็กที่ตรงกับเป้าหมายนั้นด้วยซ้ำ ฉันต้องการทำทีละขั้นตอนเพื่อที่ฉันจะได้ตรวจสอบว่าเกิดอะไรขึ้นในรหัสแอสเซมบลีของฉันเพราะฉันไม่ใช่ผู้เชี่ยวชาญในการประกอบ x86 น่าเสียดายที่ gdb ปฏิเสธที่จะทำการดีบักระดับแอสเซมบลีอย่างง่ายนี้ ช่วยให้ฉันสามารถตั้งค่าและหยุดบนเบรกพอยต์ที่เหมาะสมได้ แต่ทันทีที่ฉันพยายามทำทีละขั้นตอนเป็นต้นไป gdb รายงานข้อผิดพลาด "ไม่พบขอบเขตของฟังก์ชันปัจจุบัน" และ EIP จะไม่เปลี่ยนแปลง รายละเอียดเพิ่มเติม: รหัสเครื่องถูกสร้างขึ้นโดยคำสั่ง gcc asm และฉันคัดลอกไปยังตำแหน่งหน่วยความจำเคอร์เนลที่มันทำงานจากเอาต์พุตของ objdump -d ฉันไม่รังเกียจวิธีง่ายๆในการใช้ตัวโหลดเพื่อโหลดรหัสออบเจ็กต์ของฉันไปยังที่อยู่ที่ย้ายตำแหน่ง แต่จำไว้ว่าการโหลดจะต้องทำในโมดูลเคอร์เนล ฉันคิดว่าอีกทางเลือกหนึ่งคือการสร้างโมดูลเคอร์เนลปลอมหรือไฟล์ข้อมูลการดีบักเพื่อมอบให้กับ gdb เพื่อทำให้เชื่อว่าพื้นที่นี้อยู่ในโค้ดโปรแกรม gdb ทำงานได้ดีบนเคอร์เนลที่รันได้เอง (สำหรับผู้ที่ต้องการทราบจริงๆฉันกำลังแทรกโค้ดที่รันไทม์ลงในพื้นที่ข้อมูลเคอร์เนลของลินุกซ์ภายใน VMware VM และทำการดีบักจาก gdb รีโมตดีบักเคอร์เนลผ่าน gdb ในตัวของ VMware Workstation หมายเหตุฉันไม่ได้เขียนเคอร์เนล หาประโยชน์ฉันเป็นนักศึกษาระดับบัณฑิตศึกษาด้านความปลอดภัยที่เขียนต้นแบบ) (ฉันสามารถตั้งค่าเบรกพอยต์สำหรับแต่ละคำสั่งภายในแอสเซมบลีของฉันได้ซึ่งใช้งานได้ แต่จะค่อนข้างลำบากหลังจากนั้นสักครู่เนื่องจากขนาดของคำแนะนำการประกอบ x86 จะแตกต่างกันไปและตำแหน่งของการประกอบจะเปลี่ยนไปทุกครั้งที่รีบูต)

3
จะแก้ไขเนื้อหาหน่วยความจำโดยใช้ GDB ได้อย่างไร
ฉันรู้ว่าเราสามารถใช้คำสั่งต่างๆเพื่อเข้าถึงและอ่านหน่วยความจำได้เช่น print, p, x ... แต่ฉันจะเปลี่ยนเนื้อหาของหน่วยความจำในตำแหน่งใดก็ได้ (ในขณะที่แก้ไขข้อบกพร่องใน GDB) ได้อย่างไร
87 c  linux  memory  gdb 

2
วิธีทำให้เบรกพอยต์ GDB แตกหลังจากจุดถึงจำนวนครั้งที่กำหนดเท่านั้น?
ฉันมีฟังก์ชันที่ถูกเรียกใช้เป็นจำนวนมากและในที่สุดก็แยกกัน อย่างไรก็ตามฉันไม่ต้องการตั้งเบรกพอยต์ที่ฟังก์ชันนี้และหยุดทุกครั้งที่เรียกเพราะฉันจะอยู่ที่นี่เป็นเวลาหลายปี ฉันได้ยินมาว่าฉันสามารถตั้งค่าcounterใน GDB สำหรับเบรกพอยต์ได้และทุกครั้งที่เบรกพอยต์ถูกตีตัวนับจะลดลงและจะถูกทริกเกอร์เมื่อcounter= 0 เท่านั้น ข้อมูลนี้ถูกต้องหรือไม่และหากเป็นเช่นนั้นฉันจะทำอย่างไร โปรดให้รหัส gdb สำหรับการตั้งค่าเบรกพอยต์
85 gdb  breakpoints 

8
ทำไม GDB จึงกระโดดข้ามบรรทัดอย่างไม่คาดคิดและพิมพ์ตัวแปรเป็น“ <value optimized out>”
ใครช่วยอธิบายพฤติกรรมของ gdb นี้ได้บ้าง? 900 memset(&amp;new_ckpt_info,'\0',sizeof(CKPT_INFO)); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_** HDR),i_offset); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_ HDR),i_offset);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** …

1
เหตุใดที่อยู่ของ __libc_start_main จึงเหมือนกันภายใน GDB แม้ว่า ASLR จะเปิดอยู่
Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6 (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/firstlove/projects/org-ioslide/example/a.out Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6 (gdb) r The program being debugged has been started already. Start it …
16 c  linux  gdb  libc  aslr 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.