Как заставить gdb показывать оригинальное имя функции без искажений на модели дизассемблирования?

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 показывать не- изменение имен функций в модели сборки?


person Jichao    schedule 24.12.2009    source источник


Ответы (3)


Вы можете сделать 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.

person Employed Russian    schedule 26.12.2009

Я не помню, чтобы когда-либо находил автоматический способ для gdb сделать это. Я всегда просто копировал и вставлял символ и запускал его с помощью утилиты Linux c++filt, чтобы распутать.

person wallyk    schedule 24.12.2009
comment
Существуют ли какие-либо различия между C++filt и адресом информационного символа? - person Jichao; 24.12.2009

gdb показывает исходное неискажающее имя функции на дизассемблированной модели ::

вы должны делать эти шаги каждый раз, когда собираетесь отлаживать. 1. включить печать demangle 2. включить печать asm-demangle

В противном случае вы можете создать файл vim ~/.gdbinit, аналогичный файлу ~/.vimrc, и установить следующие шаги, чтобы вам не нужно было выполнять их каждый раз на . 1 установить печать красиво на 2 установить печать demangle на 3 установить печать asm-demangle на

person Ramanand Yadav    schedule 30.09.2019