Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make gdb show the original non-mangling function name on disassembly model?

void outputString(const char *str) {   cout << "outputString(const char *str) : " << str << endl; } 

turns out to be

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. 

All the disassemblies show only the manglinged function names,but its not eaiser for programmer to de-mangling and get the original function names with the bother to typing info symbol address for each mangling name met,so are there any methods that could make gdb show non-mangling function names on assembly model?

like image 841
Jichao Avatar asked Dec 24 '09 07:12

Jichao


1 Answers

You could do maint demangle _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc at the (gdb) prompt.

The manual says:

`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. 

Unfortunately, it doesn't appear to work:

(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. 

The setting changed how the current function is printed, but not how the functions it calls are printed (which is what I assume you are after).

I think that is a bug in GDB, please file a bug in bugzilla.

Update:

The bug has been fixed in 2013. With GDB-10.0 the output is:

(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 
like image 120
Employed Russian Avatar answered Sep 17 '22 14:09

Employed Russian