GDB में वर्तमान विधानसभा निर्देश दिखाएं


179

मैं GDB में कुछ असेंबली-स्तरीय डिबगिंग कर रहा हूं। क्या GDB प्राप्त करने का कोई तरीका है जो मुझे वर्तमान विधानसभा निर्देश को उसी तरह से दिखा सकता है जैसे कि यह वर्तमान स्रोत लाइन दिखाता है? प्रत्येक कमांड के बाद डिफ़ॉल्ट आउटपुट इस तरह दिखता है:

0x0001433f      990         Foo::bar(p);

यह मुझे वर्तमान निर्देश का पता देता है, लेकिन मुझे disassembleवर्तमान में निष्पादित होने वाले निर्देश को देखने के लिए आउटपुट पर वापस रखना होगा ।


जवाबों:


314

आप GDB में असेंबली लेआउट पर जा सकते हैं:

(gdb) layout asm

अधिक जानकारी के लिए यहाँ देखें । वर्तमान असेंबली इंस्ट्रक्शन को असेम्बलर विंडो में दिखाया जाएगा।

   ┌───────────────────────────────────────────────────────────────────────────┐
   │0x7ffff740d756 <__libc_start_main+214>  mov    0x39670b(%rip),%rax        #│
   │0x7ffff740d75d <__libc_start_main+221>  mov    0x8(%rsp),%rsi              │
   │0x7ffff740d762 <__libc_start_main+226>  mov    0x14(%rsp),%edi             │
   │0x7ffff740d766 <__libc_start_main+230>  mov    (%rax),%rdx                 │
   │0x7ffff740d769 <__libc_start_main+233>  callq  *0x18(%rsp)                 │
  >│0x7ffff740d76d <__libc_start_main+237>  mov    %eax,%edi                   │
   │0x7ffff740d76f <__libc_start_main+239>  callq  0x7ffff7427970 <exit>       │
   │0x7ffff740d774 <__libc_start_main+244>  xor    %edx,%edx                   │
   │0x7ffff740d776 <__libc_start_main+246>  jmpq   0x7ffff740d6b9 <__libc_start│
   │0x7ffff740d77b <__libc_start_main+251>  mov    0x39ca2e(%rip),%rax        #│
   │0x7ffff740d782 <__libc_start_main+258>  ror    $0x11,%rax                  │
   │0x7ffff740d786 <__libc_start_main+262>  xor    %fs:0x30,%rax               │
   │0x7ffff740d78f <__libc_start_main+271>  callq  *%rax                       │
   └───────────────────────────────────────────────────────────────────────────┘
multi-thre process 3718 In: __libc_start_main     Line: ??   PC: 0x7ffff740d76d
#3  0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00007ffff74671ff in _IO_file_overflow ()
   from /lib/x86_64-linux-gnu/libc.so.6
#5  0x0000000000408756 in ?? ()
#6  0x0000000000403980 in ?? ()
#7  0x00007ffff740d76d in __libc_start_main ()
   from /lib/x86_64-linux-gnu/libc.so.6
(gdb)

1
@greatwolf, लगता है कि आपके gdb में कोई तुई समर्थन नहीं है। : अधिक जानकारी के लिए इस सवाल का देखें stackoverflow.com/q/6706838/72178
ks1322

9
साफ! अब क्या मैं रजिस्टरों के लिए एक समान खिड़की रख सकता हूं? वास्तव में मैं कर सकता हूँ:layout regs
जेन्स

अन्य TUI कमांड के लिए gdb डॉक्स भी देखें , जैसे tui reg vectorकि पूर्णांक के बजाय वेक्टर रेज को दिखाना। (हमेशा बहुत प्रयोग करने योग्य नहीं है, हालांकि, क्योंकि यह आपको सिर्फ .v8_int16या कुछ लेने नहीं देता है, इसलिए प्रदर्शन एक बड़ी गड़बड़ी है।) x86 टैग विकी को एश डीबग करने के लिए एक त्वरित ट्यूटोरियल के लिए देखें।
पीटर कॉर्डेस

यह एक बेकार सुविधा और आउटपुट के बारे में है। C ++ मंगली नाम बहुत लंबे हैं, और मैं जो कुछ भी देखने की कोशिश कर रहा हूं, वह दाईं ओर स्क्रीन बंद है। क्या बेवकूफी भरा निर्णय है (कब डिफ़ॉल्ट रूप से ASM प्रदर्शित करने के लिए नहीं si), और क्या एक बेकार विशेषता (व्यूपोर्ट जो आवश्यक जानकारी प्रदर्शित नहीं करता है)। नीचे इस संदेश का कोई मतलब नहीं है क्योंकि आप केवल संदेशवाहक हैं ...
jw

1
इसी तरह, ·layout srcडिबगिंग करते समय स्रोत कोड देखने के लिए, और इस मोड से बाहर निकलने को याद करते हुए भी CTRL+x+a
चिंता होती

149

तुम कर सकते हो

display/i $pc

और हर बार GDB बंद हो जाता है, यह अगले निर्देश के disassembly प्रदर्शित करेगा।

GDB-7.0भी समर्थन करता है set disassemble-next-line on, जो पूरी अगली पंक्ति को जुदा कर देगा, और आपको अधिक disassembly संदर्भ देगा।


1
उपयोग करते समय si(लेकिन नहीं s) हम इस सुविधा को कैसे सक्षम करते हैं ?
jww

54

आदेश

x/i $pc

सामान्य कॉन्फ़िगरेशन तंत्र का उपयोग करके हर समय चलाने के लिए सेट किया जा सकता है।


29
और x/ni $pcअगले एन निर्देशों को देखने के लिए, जो अक्सर काफी उपयोगी होता है।
स्टीफन कैनन

48

निम्न विकल्प सेट करना:

set  disassemble-next-line on
show disassemble-next-line

आपको इस तरह दिखने वाले परिणाम देंगे:

(gdb) stepi
0x000002ce in ResetISR () at startup_gcc.c:245
245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
=> 0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
   0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
(gdb) stepi
0x000002d0  245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
   0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
=> 0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0

यह विकल्प मेरी स्थापना में मौजूद नहीं है। क्या इसे हटाया गया है?
फुज

2
@fuz अधिक संभावना है, अपने gdb पुराना है
tbodt

@ कम से कम GDB 8.1 में Ubuntu 18.04 में मौजूद है।
सिरो सेंटिल्ली 郝海东 冠状 iro 事件 法轮功 '

बहुत उपयोगी कौशल
DaSqy Stc

1
शो जुदा-अगली-लाइन परीक्षण के लिए है, ध्वज की स्थिति को मुद्रित करने के लिए, चालू या बंद
सैम

30

यदि आप चाहते हैं कि अगले कुछ निर्देश प्रोग्राम के माध्यम से स्वचालित रूप से प्रदर्शित हों तो आप प्रदर्शन कमांड का उपयोग इस प्रकार कर सकते हैं -

display /3i $pc

जब भी कोई ब्रेकपॉइंट हिट होता है या जब आप प्रोग्राम को स्टेप करते हैं तो ऊपर 3 निर्देश प्रदर्शित होंगे।

ब्लॉग प्रविष्टि पर अधिक जानकारी यहाँ


23

जीडीबी प्रेस के भीतर से Ctrl x 2और स्क्रीन 3 भागों में विभाजित हो जाएगी।

पहला भाग आपको उच्च स्तरीय भाषा में सामान्य कोड दिखाएगा।

दूसरा आपको विधानसभा के समतुल्य और अनुरूप दिखाएगा instruction Pointer

तीसरा आपको gdbकमांड दर्ज करने के लिए सामान्य संकेत देगा।

स्क्रीन शॉट देखें


मैं इसके साथ लॉन्च नहीं कर सकता था Ctrl-X 2, लेकिन यह gdb -tuiमोड की तरह दिखता है, जो बहुत अच्छा है।
सिरो सेंटिल्ली 郝海东 冠状 i i 法轮功 '

7
यह भी layout splitgdb प्रॉम्प्ट से उपलब्ध है।
चकमाश

22

GDB डैशबोर्ड

https://github.com/cyrus-and/gdb-dashboard

यह GDB कॉन्फ़िगरेशन हमें आधिकारिक GDB Python API का उपयोग करता है, जो भी हम चाहते हैं कि जब भी उदाहरण के लिए GDB बंद हो जाता nextहै, TUI की तरह हमें दिखाने के लिए ।

हालाँकि मैंने पाया है कि यह कार्यान्वयन अंतर्निहित GDB TUI मोड के लिए एक अधिक मजबूत और विन्यास योग्य विकल्प है, जैसा कि समझाया गया है: कोड के साथ gdb विभाजन दृश्य

उदाहरण के लिए, हम disassembly, स्रोत, रजिस्टरों और स्टैक को दिखाने के लिए GDB डैशबोर्ड को कॉन्फ़िगर कर सकते हैं:

dashboard -layout source assembly registers stack

यदि आप इसके बजाय सभी उपलब्ध विचारों को सक्षम करते हैं तो यह ऐसा दिखता है:

यहां छवि विवरण दर्ज करें

संबंधित सवाल:


1
@downvoters: कृपया समझाएं ताकि मैं जानकारी सीख सकूं और सुधार सकूं। मेरा मानना ​​है कि वर्तमान में स्वीकृत उत्तर: टीयूआई के लिए यह एक बेहतर विकल्प है: stackoverflow.com/a/2015523/895245
Ciro Santilli 郝海东 a a 六四
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.