2009-12-24 18 views
14
void outputString(const char *str) { 
    cout << "outputString(const char *str) : " << str << endl; 
} 

原來是如何讓gdb在反彙編模型上顯示原始的非加密函數名稱?

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. 

所有反彙編,只顯示manglinged函數名,但其不eaiser程序員去忙玲,並獲得與麻煩原有的功能名稱爲每個輸入info symbol address mangling name met,那麼是否有任何方法可以使gdb在彙編模型中顯示非加載函數名稱?

回答

18

您可以在(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 <[email protected]> 
0x00000000004009df <outputString(char const*)+27>: mov %rax,%rdi 
0x00000000004009e2 <outputString(char const*)+30>: mov -0x8(%rbp),%rsi 
0x00000000004009e6 <outputString(char const*)+34>: callq 0x400798 <[email protected]> 
0x00000000004009eb <outputString(char const*)+39>: mov %rax,%rdi 
0x00000000004009ee <outputString(char const*)+42>: mov $0x4007c8,%esi 
0x00000000004009f3 <outputString(char const*)+47>: callq 0x4007b8 <[email protected]> 
0x00000000004009f8 <outputString(char const*)+52>: leaveq 
0x00000000004009f9 <outputString(char const*)+53>: retq 
End of assembler dump. 

設置改變當前功能的打印方式,但它不是如何調用功能打印出來(這是我以爲你是在之後)。

我認爲這是一個在GDB中的錯誤,請在bugzilla中提交錯誤。

+0

,但它在我的MinGW端口運行良好。 – Jichao 2009-12-29 16:43:15

+1

有一個錯誤報告,https://sourceware.org/bugzilla/show_bug.cgi?id=12021。這隻適用於帶有@plt後綴的符號。 – Ruslan 2013-09-23 09:09:04

+0

在2015年效果很好。 – 2015-07-29 03:22:42

3

我不記得有沒有找到一種自動方式讓gdb來做到這一點。我總是複製並粘貼該符號,並通過Linux c++filt實用程序將其運行並取消。

+0

C++ filt和info symbol addr之間是否有區別? – Jichao 2009-12-24 08:07:22