【问题标题】:how to make gdb show line numbers with respect to function's head?如何让 gdb 显示关于函数头部的行号?
【发布时间】:2019-02-14 21:48:06
【问题描述】:

这是我的 gdb 输出。我怎样才能让它写行号,而不是 ...227main+1,就像我反汇编它时显示的那样?

【问题讨论】:

  • 这不正是尖括号中所说的吗?
  • 是的......我希望它在我在 BP 之后进入代码时显示出来,这样我更容易理解
  • 哦,对,完全误读了。继续:)
  • 反汇编显示的是relative address而不是relative kine number。地址和源文件行号之间没有直接对应关系。因此,很难理解您想要什么或它将如何提供帮助。
  • 我认为 display /i $pc 是您所需要的 - 我已添加到我的答案中。但是,您应该通过编辑问题而不是在评论中阐明您的要求。那就是说你的评论仍然不太清楚。我认为问题在于您要求以不同的格式打印行号,而实际上它不是行号而是您真正想要的地址。

标签: c gdb


【解决方案1】:

由于机器指令地址和源代码行号没有直接关系,因此不清楚您在问什么。可能适合您的需要是使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2012-01-13
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2012-05-28
    相关资源
    最近更新 更多