如何使gdb显示相对于函数头的行号?

时间:2019-02-14 21:48:07

标签: c gdb

this,这是我的gdb输出。当我反汇编它时,如何显示行号而不是将...227写成main+1

1 个答案:

答案 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)