我的 gdbbt
调用堆栈给出了函数名称和函数地址。然后我做了nm binary
并生成了函数名和地址映射。当我尝试将 gdb 地址与nm
输出匹配时,它不匹配。函数地址(gdb) bt
太高(看起来像物理地址)。
gdb 函数地址(例如0x00007fffe6fc150f
):
#9 0x00007fffe6fc150f in read_alias_file (fname=<value optimized out>, fname_len=<value optimized out>) at localealias.c:224
#10 0x00007fffe6fc1a4e in _nl_expand_alias (name=0x7fffffffed04 "en_IN") at localealias.c:189
#11 0x00007fffe6fbb62f in _nl_find_locale (locale_path=0x7fffe70df580 "/usr/lib/locale", locale_path_len=16, category=12, name=0x7fffffffdb90) at findlocale.c:119
#12 0x00007fffe6fbacf6 in *__GI_setlocale (catesagory=12, locale=<value optimized out>) at setlocale.c:303
#13 0x00007ffff17b8686 in
但是当我nm
从二进制文件中获取地址时,我得到的是这样的
0000000005ddda04 t StubGLBindFragDataLocationIndexed
0000000005ddda3f t StubGLBindFramebuffer
0000000005ddda65 t StubGLBindRenderbuffer
0000000005ddda8b t StubGLBindTexture
0000000005dddab1 t StubGLBlendColor
0000000005dddaef t StubGLBlendFunc
0000000005dddb15 t StubGLBlitFramebuffer
0000000005dddb7e t StubGLBufferData
0000000005dddbbd t StubGLBufferSubData
0000000005dddc00 t StubGLCheckFramebufferStatus
0000000005dddc1e t StubGLClear
0000000005dddc3c t StubGLClearColor
0000000005dddc7a t StubGLClearStencil
0000000005dddc98 t StubGLColorMask
0000000005dddcda t StubGLCompileShader
机器是 64 位的。
据我所知,gdb 只显示虚拟地址。但我不知道为什么它会这么高并且与地址当前的 nm 输出不匹配
难道gdb地址都是虚拟地址???。nm
o/p 看起来像实际的虚拟地址,因为它从 000000000 开始。但是为什么会自动添加基地址呢?
注意:我尝试使用示例 test.out。效果很好。调用堆栈地址是虚拟地址,bt
与nm a.out
符号输出完全匹配。