【问题标题】:How to make gdb show the original non-mangling function name on disassembly model?如何使 gdb 在反汇编模型上显示原始的非修饰函数名称?
【发布时间】:2010-12-29 18:11:11
【问题描述】:
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 在装配模型上显示非修饰函数名称?

【问题讨论】:

标签: gdb name-mangling disassembly


【解决方案1】:

您可以在(gdb) 提示符处执行maint demangle _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc

手册说:

`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 中提交错误。

【讨论】:

  • 有一个错误报告,sourceware.org/bugzilla/show_bug.cgi?id=12021。这仅对带有@plt 后缀的符号不起作用。
  • 我遇到的问题是未损坏的符号太长了,它们不适合 2 显示器... :)
  • 在新版本中maint demangle 只是demangle
  • 它现在也修复了这个错误,set print asm-demangle on 工作正常!
【解决方案2】:

我不记得曾经为 gdb 找到一种自动的方式来做到这一点。我总是只是复制并粘贴该符号,然后通过 Linux c++filt 实用程序运行它来进行解码。

【讨论】:

  • c++filt和info symbol addr有区别吗?
【解决方案3】:

gdb 在反汇编模型上显示原始的非修饰函数名称 ::

每次要调试时都必须执行此步骤。 1. 设置打印 demangle on 2.设置打印asm-demangle on

否则,您可以创建 vim ~/.gdbinit 文件,如 ~/.vimrc 文件并设置以下步骤,这样您就无需每次都在 . 1 套打印漂亮 2 设置打印 demangle on 3 设置打印 asm-demangle on

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多