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

How to let gdb print both source code corresponding disassembly together?

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

"L" to list source code

"disass" to list assembly code.

但我想像windows visual studio中看到的那样显示,列出一行源代码,列出其对应的反汇编(几行),然后是另一行源代码,等等。

我猜gdb应该支持这个,怎么指定?

您可以使用 /m/s 标志混合源代码和程序集 disassemble。通常我认为前者是你想要的。所以:

(gdb) disassemble/m main

But I wish to display like what I can see in windows visual studio, list one line of source code, list its corresponding disassembly(several lines)

您可以使用 one of gdb TUI layouts。这是 /usr/bin/lslayout 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    [=11=]x3a8,%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    [=11=]x6,%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   [=11=]x2,(%rax)               │
   │0x555555557a16 <main+118>       callq  0x555555569020 <atexit>   │
   │0x555555557a1b <main+123>       movabs [=11=]x8000000000000000,%rax  │
   └─────────────────────────────────────────────────────────────────┘
Thread 0x7ffff7fd78 In: main                 L1249 PC: 0x5555555579a0 
(gdb) 

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