Как да накарам 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
comment
Има доклад за грешка, sourceware.org/bugzilla/show_bug.cgi?id=12021 . Това не работи само за символи със суфикс @plt. - person Ruslan; 23.09.2013
comment
Проблемът, който имам е, че необезпокоените символи са толкова дълги, че не се побират на 2 монитора... :) - person Mark Lakata; 02.05.2017

Не си спомням някога да съм намирал автоматичен начин gdb да го направи. Винаги просто копирах и поставях символа и го пусках през помощната програма Linux c++filt, за да демонтирам.

person wallyk    schedule 24.12.2009
comment
има ли разлики между c++filt и info symbol addr? - person Jichao; 24.12.2009

gdb показва оригиналното име на функция без разглобяване на модел за разглобяване ::

трябва да правите тези стъпки всеки път, когато ще отстранявате грешки. 1. задайте print demangle на 2. задайте print asm-demangle на

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

person Ramanand Yadav    schedule 30.09.2019