有许多问题缺少源文件等,我尝试了所有我找不到的东西。
这是关于我的图书馆,有一些帮助应用程序。我使用autotools(和libtool)。
我已经使用-g
编译了我的代码并且没有进行优化(后来尝试使用-ggdb3
并且没有可观察到的差异w.r.t这个问题)。我在已安装的文件上尝试了gdb
,并且libtool --mode=execute gdb build/dir/file
没有区别。
如果我使用objdump -W
,我可以看到以下内容(让我们采用随机函数并仅跟踪它):
$ objdump /usr/bin/that_file
...
<1><a11>: Abbrev Number: 38 (DW_TAG_subprogram)
<a12> DW_AT_name : (indirect string, offset: 0xbcc2): fill_memory
<a16> DW_AT_decl_file : 4
<a17> DW_AT_decl_line : 98
<a18> DW_AT_prototyped : 1
<a18> DW_AT_type : <0x3c>
<a1c> DW_AT_low_pc : 0x4010ce
<a24> DW_AT_high_pc : 0x92 0x0
<a2c> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa)
<a2e> DW_AT_GNU_all_tail_call_sites: 1
<a2e> DW_AT_sibling : <0xa83>
...
The Directory Table:
...
../../../apps/calibrator
...
The File Name Table:
...
4 2 0 0 main.c
...
您可以看到符号位于../../../apps/calibrator/main.c
的第98行,相对于文件的构建位置。如果我使用gdb,并执行info sources
(在运行之前),我得到:
(gdb) info sources
Source files for which symbols have been read in:
Source files for which symbols will be read in on demand:
..., /path/to/my/library/apps/calibrator/main.c
这意味着gdb
正确地看到了该源文件。如果我打破main.c
中的某个函数(例如main
),我会看到该文件仍在“将按需读取”的文件中,而不是已经读取的文件。
如果我info source
,此时它会告诉我“没有当前的源文件”。如果我使用objdump -dl
,我会看到:
00000000004010ce <fill_memory>:
fill_memory():
4010ce: 55 push %rbp
4010cf: 48 89 e5 mov %rsp,%rbp
...
因此objdump -dl
也看不到与该符号关联的文件/行号。如果在gdb
中,我会list main
,我会收到“没有为主号码知道的行号。”
objdump -dl
为什么objdump -W
没有看到行号?我错过了什么?