Como hacer GDB mostrar el nombre de función no mangling modelo original en el desmontaje?
-
21-09-2019 - |
Pregunta
void outputString(const char *str) {
cout << "outputString(const char *str) : " << str << endl;
}
resulta ser
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 muestran sólo los nombres de las funciones manglinged, pero no es eaiser para el programador de la DE-mangling y obtener los nombres de las funciones originales con la molestia de escribir info symbol address
para cada nombre mangling se reunió, por lo que ¿hay métodos que podrían hacer que el BGF mostrar los nombres de función no calandrado en modelo de ensamblaje?
Solución
Usted podría hacer maint demangle _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
en el indicador (gdb)
.
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 <_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.
La configuración ha cambiado cómo se imprime la función actual, pero no cómo las funciones se imprimen que llama (que es lo que supongo que está después).
Creo que es un error en GDB
, por favor, envíe una informe Bugzilla .
Otros consejos
No recuerdo alguna vez encontrar una manera automática para GDB hacerlo. Siempre acaba de copiar y pegar el símbolo y pasé por la utilidad Linux para c++filt
demangle.