2010-01-29 12 views
5

क्या जीडीबी का उपयोग किया जा सकता है जैसे कि यह एक पारंपरिक असेंबली मॉनीटर था?मॉनिटर के रूप में जीडीबी का उपयोग करना?

जैसे ही आप उदाहरण में कदम रखते हैं। पुस्तकालय कोड यह रिटर्न:

No function contains program counter for selected frame 

GDB डिबगर अज्ञात कोड लेकिन GDB यूआई काम करना बंद में कदम करने में सक्षम है।

इस संबंधित question में आप प्रस्तावित समाधानों की एक जोड़ी पा सकते हैं लेकिन न ही मुझे काफी संतुष्ट करता है।

क्या होगा यदि बाइनरी लाइब्रेरी डिबगिंग प्रतीक पैकेज के साथ नहीं आती है? क्या होगा यदि प्रोग्राम रन-टाइम जेनरेट कोड में कूदता है?

कोड को अलग करना वास्तव में एक समाधान नहीं है क्योंकि यूआई इसे अनदेखा करता है, सबसे महत्वपूर्ण बात यह है कि रजिस्टरों के मान अपडेट नहीं होते हैं जब तक आप मूल ज्ञात कोड पर वापस नहीं जाते। info registers काम करता है, लेकिन यह शायद ही इंटरैक्टिव है।

कोई सुझाव?

धन्यवाद!

उत्तर

8

आप display कमांड के साथ इस तरह की चीज कर सकते हैं।

display/i $pc वर्तमान अनुदेश बस से पहले शीघ्र हर बार छपा है एकत्रित न होगा:

(gdb) b main 
Breakpoint 1 at 0x80483b5: file hw.c, line 5. 
(gdb) display/i $pc 
(gdb) r 
Starting program: /tmp/hw 

Breakpoint 1, main() at hw.c:5 
5   puts("Hello world"); 
1: x/i $pc 
0x80483b5 <main+17>: movl $0x8048490,(%esp) 

अब एक अनुदेश कदम (फिर बस को दोहराने के लिए दर्ज मार रखने के लिए):

(gdb) si 
0x080483bc  5   puts("Hello world"); 
1: x/i $pc 
0x80483bc <main+24>: call 0x80482d4 <[email protected]> 
(gdb) 
0x080482d4 in [email protected]() 
1: x/i $pc 
0x80482d4 <[email protected]>: jmp *0x804959c 
Current language: auto; currently asm 
(gdb) 
0x080482da in [email protected]() 
1: x/i $pc 
0x80482da <[email protected]+6>: push $0x10 
(gdb) 
0x080482df in [email protected]() 
1: x/i $pc 
0x80482df <[email protected]+11>:  jmp 0x80482a4 <_init+48> 

यह अभी भी जब हम इस बिंदु पर पहुंचते हैं तो काम करता है:

(gdb) 
0x080482a4 in ??() 
1: x/i $pc 
0x80482a4 <_init+48>: pushl 0x804958c 
(gdb) 
0x080482aa in ??() 
1: x/i $pc 
0x80482aa <_init+54>: jmp *0x8049590 
(gdb) 
0xb7f052d0 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
1: x/i $pc 
0xb7f052d0 <_dl_runtime_resolve>:  push %eax 

एक से अधिक display अभिव्यक्ति एक बार में सक्रिय हो सकती है (उन्हें हटाने के लिए undisplay <number> का उपयोग करें)। उदाहरण के लिए, को देखने के लिए क्या %eax के लिए होता: देखा

(gdb) display/x $eax 
2: /x $eax = 0xbf90ab34 
(gdb) si 
0xb7f052d1 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d1 <_dl_runtime_resolve+1>:  push %ecx 
(gdb) 
0xb7f052d2 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d2 <_dl_runtime_resolve+2>:  push %edx 
(gdb) 
0xb7f052d3 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d3 <_dl_runtime_resolve+3>:  mov 0x10(%esp),%edx 
(gdb) 
0xb7f052d7 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d7 <_dl_runtime_resolve+7>:  mov 0xc(%esp),%eax 

... और यहाँ %eax में परिवर्तन किया जा सकता है:

(gdb) 
0xb7f052db in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xb7f0d668 
1: x/i $pc 
0xb7f052db <_dl_runtime_resolve+11>: call 0xb7eff780 <_dl_fixup> 
(gdb) 
+0

विकल्प की तुलना में बेहतर है, लेकिन यह TUI पर साथ काम नहीं करता । मैं इसे थोड़ी देर के बाद स्वीकार किए गए उत्तर के रूप में चिह्नित करूंगा क्योंकि मुझे एहसास है कि कोई वास्तविक समाधान नहीं हो सकता है। – jbcreix

संबंधित मुद्दे