如何让gdb打印两个源代码对应的反汇编?

时间:2016-10-25 02:22:29

标签: debugging gcc gdb disassembly

我用“-g”命令编译了我的代码,在gdb中我可以

  

“L”列出源代码

     

“disass”列出汇编代码。

但是我想在windows visual studio中看到我所能看到的,列出一行源代码,列出其对应的反汇编(几行),然后是另一行源代码,依此类推。

我猜gdb应该支持这个,如何指定?

2 个答案:

答案 0 :(得分:2)

您可以使用/m/s标记将源和汇编混合到disassemble。通常我认为前者就是你想要的。所以:

(gdb) disassemble/m main

答案 1 :(得分:0)

  

但我想在windows visual studio中看到我所能看到的内容,   列出一行源代码,列出其对应的   反汇编(几行)

您可以使用one of gdb TUI layouts。以下是/usr/bin/ls layout asm的示例调试会话:

[ksemenov@NB824RIH ~]$ gdb -q /usr/bin/ls
Reading symbols from /usr/bin/ls...Reading symbols from /usr/lib/debug/usr/bin/ls.debug...done.
done.
(gdb) start 
Temporary breakpoint 1 at 0x39a0: file ../src/ls.c, line 1249.
Starting program: /usr/bin/ls 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdde8) at ../src/ls.c:1249
1249    {
Missing separate debuginfos, use: dnf debuginfo-install pcre-8.39-3.fc24.x86_64
(gdb) layout asm 

以下是gdb中的样子:

   ┌─────────────────────────────────────────────────────────────────┐
  >│0x5555555579a0 <main>           push   %r15                      │
   │0x5555555579a2 <main+2>         push   %r14                      │
   │0x5555555579a4 <main+4>         mov    %edi,%r15d                │
   │0x5555555579a7 <main+7>         push   %r13                      │
   │0x5555555579a9 <main+9>         push   %r12                      │
   │0x5555555579ab <main+11>        mov    %rsi,%r14                 │
   │0x5555555579ae <main+14>        push   %rbp                      │
   │0x5555555579af <main+15>        push   %rbx                      │
   │0x5555555579b0 <main+16>        sub    $0x3a8,%rsp               │
   │0x5555555579b7 <main+23>        mov    (%rsi),%rdi               │
   │0x5555555579ba <main+26>        mov    %fs:0x28,%rax             │
   │0x5555555579c3 <main+35>        mov    %rax,0x398(%rsp)          │
   │0x5555555579cb <main+43>        xor    %eax,%eax                 │
   │0x5555555579cd <main+45>        callq  0x555555562ed0 <set_progra│
   │0x5555555579d2 <main+50>        lea    0x15e7c(%rip),%rsi        │
   │0x5555555579d9 <main+57>        mov    $0x6,%edi                 │
   │0x5555555579de <main+62>        callq  0x5555555578a8            │
   │0x5555555579e3 <main+67>        lea    0x1302d(%rip),%rsi        │
   │0x5555555579ea <main+74>        lea    0x1300c(%rip),%rdi        │
   │0x5555555579f1 <main+81>        callq  0x5555555576d8            │
   │0x5555555579f6 <main+86>        lea    0x13000(%rip),%rdi        │
   │0x5555555579fd <main+93>        callq  0x5555555576b8            │
   │0x555555557a02 <main+98>        lea    0x21b7cf(%rip),%rax       │
   │0x555555557a09 <main+105>       lea    0x7c60(%rip),%rdi        #│
   │0x555555557a10 <main+112>       movl   $0x2,(%rax)               │
   │0x555555557a16 <main+118>       callq  0x555555569020 <atexit>   │
   │0x555555557a1b <main+123>       movabs $0x8000000000000000,%rax  │
   └─────────────────────────────────────────────────────────────────┘
Thread 0x7ffff7fd78 In: main                 L1249 PC: 0x5555555579a0 
(gdb) 

除了layout asm之外还有其他布局。另请参阅layout split,这可能更符合您的需求。