如何让 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/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 [=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
,这可能更符合您的需求。
我用“-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/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 [=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
,这可能更符合您的需求。