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

resulta ser¿Cómo hacer que gdb muestre el nombre original de la función no manipulable en el modelo de desmontaje?

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. 

Todos los desmontajes mostrar sólo los nombres de las funciones manglinged, pero no es eaiser para el programador de de-mangling y obtener los nombres de las funciones originales con la molestia de escribir info symbol address para cada El nombre de mangle se reunió, entonces ¿hay algún método que pueda hacer que gdb muestre nombres de funciones no manipulables en el modelo de ensamblaje?

Respuesta

18

Puede hacer maint demangle _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc en el (gdb) prompt.

El manual dice:

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

Por desgracia, no parece funcionar:

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

el ajuste cambiado cómo se imprime la función actual, pero no cómo las funciones que llama están impresos (que es lo que supongo que buscas).

Creo que es un error en GDB, por favor presente un error en bugzilla.

+0

pero funciona bien en mi puerto MinGW. – Jichao

+1

Hay un informe de error, https://sourceware.org/bugzilla/show_bug.cgi?id=12021. Esto solo no funciona para los símbolos con @plt sufijo. – Ruslan

+0

Funciona muy bien en 2015. –

3

No recuerdo haber encontrado nunca una manera automática de hacerlo por gdb. Siempre acabo de copiar y pegar el símbolo y ejecutarlo a través de la utilidad Linux c++filt para demangle.

+0

¿hay alguna diferencia entre C++ filt y el símbolo de información addr? – Jichao

Cuestiones relacionadas