void outputString(const char *str) {
cout << "outputString(const char *str) : " << str << endl;
}
原来是
Dump of assembler code for function _Z12outputStringPKc:
0x004013ee <_Z12outputStringPKc+0>: push ebp
0x004013ef <_Z12outputStringPKc+1>: mov ebp,esp
0x004013f1 <_Z12outputStringPKc+3>: sub esp,0x8
0x004013f4 <_Z12outputStringPKc+6>: mov DWORD PTR [esp+4],0x443000
0x004013fc <_Z12outputStringPKc+14>: mov DWORD PTR [esp],0x4463c0
0x00401403 <_Z12outputStringPKc+21>: call 0x43f6e8 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc>
0x00401408 <_Z12outputStringPKc+26>: mov edx,DWORD PTR [ebp+8]
0x0040140b <_Z12outputStringPKc+29>: mov DWORD PTR [esp+4],edx
0x0040140f <_Z12outputStringPKc+33>: mov DWORD PTR [esp],eax
0x00401412 <_Z12outputStringPKc+36>: call 0x43f6e8 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc>
0x00401417 <_Z12outputStringPKc+41>: mov DWORD PTR [esp+4],0x43e4c8
0x0040141f <_Z12outputStringPKc+49>: mov DWORD PTR [esp],eax
0x00401422 <_Z12outputStringPKc+52>: call 0x42e170 <_ZNSolsEPFRSoS_E>
0x00401427 <_Z12outputStringPKc+57>: leave
0x00401428 <_Z12outputStringPKc+58>: ret
End of assembler dump.
所有的反汇编都只显示了重整的函数名称,但是对于程序员来说,要反重整并获得原始函数名称并不容易,而且还要为每个遇到的重整名称键入
info symbol address
,那么有什么方法可以使gdb在装配模型上显示非修饰函数名称?
您可以在
maint demangle _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
提示下执行 (gdb)
。说明书上写着:
`set print asm-demangle'
`set print asm-demangle on'
Print C++ names in their source form rather than their mangled
form, even in assembler code printouts such as instruction
disassemblies. The default is off.
不幸的是,它似乎不起作用:
(gdb) set print asm-demangle on
(gdb) disas
Dump of assembler code for function _Z12outputStringPKc:
0x00000000004009c4 <outputString(char const*)+0>: push %rbp
0x00000000004009c5 <outputString(char const*)+1>: mov %rsp,%rbp
0x00000000004009c8 <outputString(char const*)+4>: sub $0x10,%rsp
0x00000000004009cc <outputString(char const*)+8>: mov %rdi,-0x8(%rbp)
0x00000000004009d0 <outputString(char const*)+12>: mov $0x400bb0,%esi
0x00000000004009d5 <outputString(char const*)+17>: mov $0x6012a0,%edi
0x00000000004009da <outputString(char const*)+22>: callq 0x400798 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x00000000004009df <outputString(char const*)+27>: mov %rax,%rdi
0x00000000004009e2 <outputString(char const*)+30>: mov -0x8(%rbp),%rsi
0x00000000004009e6 <outputString(char const*)+34>: callq 0x400798 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x00000000004009eb <outputString(char const*)+39>: mov %rax,%rdi
0x00000000004009ee <outputString(char const*)+42>: mov $0x4007c8,%esi
0x00000000004009f3 <outputString(char const*)+47>: callq 0x4007b8 <_ZNSolsEPFRSoS_E@plt>
0x00000000004009f8 <outputString(char const*)+52>: leaveq
0x00000000004009f9 <outputString(char const*)+53>: retq
End of assembler dump.
该设置更改了当前函数的打印方式,但没有更改其调用的函数的打印方式(我假设您就是这样)。
我认为这是
GDB
中的错误,请在 bugzilla 中提交错误。
更新:
该错误已于 2013 年修复。GDB-10.0 的输出为:
(gdb) disas 0x555555555169
Dump of assembler code for function _Z12outputStringPKc:
0x0000555555555169 <+0>: push %rbp
0x000055555555516a <+1>: mov %rsp,%rbp
0x000055555555516d <+4>: sub $0x10,%rsp
0x0000555555555171 <+8>: mov %rdi,-0x8(%rbp)
0x0000555555555175 <+12>: lea 0xe8c(%rip),%rax # 0x555555556008
0x000055555555517c <+19>: mov %rax,%rsi
0x000055555555517f <+22>: lea 0x2efa(%rip),%rax # 0x555555558080 <std::cout@GLIBCXX_3.4>
0x0000555555555186 <+29>: mov %rax,%rdi
0x0000555555555189 <+32>: callq 0x555555555040 <std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)@plt>
0x000055555555518e <+37>: mov %rax,%rdx
0x0000555555555191 <+40>: mov -0x8(%rbp),%rax
0x0000555555555195 <+44>: mov %rax,%rsi
0x0000555555555198 <+47>: mov %rdx,%rdi
0x000055555555519b <+50>: callq 0x555555555040 <std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)@plt>
0x00005555555551a0 <+55>: mov 0x2e29(%rip),%rdx # 0x555555557fd0
0x00005555555551a7 <+62>: mov %rdx,%rsi
0x00005555555551aa <+65>: mov %rax,%rdi
0x00005555555551ad <+68>: callq 0x555555555050 <std::ostream::operator<<(std::ostream& (*)(std::ostream&))@plt>
0x00005555555551b2 <+73>: nop
0x00005555555551b3 <+74>: leaveq
0x00005555555551b4 <+75>: retq
我不记得曾经为 gdb 找到过自动执行此操作的方法。我总是只是复制并粘贴该符号,然后通过 Linux
c++filt
实用程序运行它以进行解调。
gdb 在反汇编模型上显示原始的非修改函数名称 ::
每次调试时都必须执行此步骤。 1. 将打印修角设置为开启 2. 设置 print asm-demangle 打开
否则您可以创建 vim ~/.gdbinit 文件,如 ~/.vimrc 文件并设置以下步骤,这样您就无需每次都执行 . 1 套漂亮的印刷品 2 设置打印去角 3 设置 print asm-demangle 打开
要在较新版本的 GDB 中分解任意符号,请输入
demangle xxx
或短按 dem xxx
。
例如:
(gdb) dem _ZN1C3fooEv
C::foo()
(gdb) dem _ZTV1C
vtable for C
(gdb) dem bar__C3Fooil
Foo::bar(int, long) const
参考:https://sourceware.org/gdb/current/onlinedocs/gdb.html/Debugging-C-Plus-Plus.html