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

risulta essereCome fare gdb mostra il nome della funzione non muting originale sul modello di disassemblaggio?

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. 

Tutti gli smontaggi visualizzare solo i nomi delle funzioni manglinged, ma la sua non eaiser per programmatore di de-mutilazione e ottenere i nomi delle funzioni originali con la briga di digitare info symbol address per ogni il nome di mangling incontrato, quindi ci sono dei metodi che potrebbero far sì che gdb mostri nomi di funzioni non mutevoli sul modello di assembly?

risposta

18

È possibile eseguire maint demangle _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc al prompt (gdb).

Il manuale 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. 

Purtroppo, non sembra funzionare:

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

l'impostazione modificata come viene stampata la funzione corrente, ma non come le funzioni che chiama sono stampati (che è quello che presumo tu stia cercando).

Penso che sia un bug in GDB, si prega di segnalare un bug in bugzilla.

+0

ma funziona bene nella mia porta MinGW. – Jichao

+1

C'è una segnalazione di bug, https://sourceware.org/bugzilla/show_bug.cgi?id=12021. Questo non funziona solo per i simboli con suffisso @plt. – Ruslan

+0

Funziona alla grande nel 2015. –

3

Non ricordo di aver mai trovato un modo automatico per gdb per farlo. Ho sempre copiato e incollato il simbolo e l'ho eseguito attraverso l'utilità Linux c++filt per demansionare.

+0

ci sono delle differenze tra C++ filt e info symbol addr? – Jichao

Problemi correlati