答案 0 :(得分:2)
由于机器指令地址和源代码行号没有直接关系,因此不清楚您要问什么。可能适合您的需求是使用 mixed 源/反汇编。例如:
(gdb) disassemble /m main
Dump of assembler code for function main:
5 {
0x08048330 <+0>: push %ebp
0x08048331 <+1>: mov %esp,%ebp
0x08048333 <+3>: sub $0x8,%esp
0x08048336 <+6>: and $0xfffffff0,%esp
0x08048339 <+9>: sub $0x10,%esp
6 printf ("Hello.\n");
0x0804833c <+12>: movl $0x8048440,(%esp)
0x08048343 <+19>: call 0x8048284 <puts@plt>
7 return 0;
8 }
0x08048348 <+24>: mov $0x0,%eax
0x0804834d <+29>: leave
0x0804834e <+30>: ret
End of assembler dump.
这显示了与机器代码相关联的汇编之前的每一行源代码。源代码行号,指令地址和偏移量均显示。请注意,如果您应用优化,因为经常会删除代码或对代码进行重新排序,使其不再与源代码顺序直接对应,那么对代码的理解可能就不那么容易了。
如果您想在步进时显示当前程序计数器的地址/偏移量,则可以使用display /i $pc
命令来完成:
(gdb) display /i $pc
(gdb) run
Starting program: /home/a.out
Breakpoint 2, main () at main.c:13
13 printf("Hello World");
1: x/i $pc
=> 0x40053a <main+4>: mov $0x4005d4,%edi
(gdb) step
__printf (format=0x4005d4 "Hello World") at printf.c:28
28 printf.c: No such file or directory.
1: x/i $pc
=> 0x7ffff7a686b0 <__printf>: sub $0xd8,%rsp
(gdb)