Как заставить 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.
Все дизассемблирования отображают только имена измененных функций, но его не eaiser для программиста для дезагурации и получения исходных имен функций с трудностью печатать info symbol address
для каждого встречающегося имени, так что есть ли какие-либо методы, которые могли бы make gdb показывает имена невостребованных функций на модели сборки?
Ответы
Ответ 1
Вы можете сделать 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 <[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.
Настройка изменила то, как печатается текущая функция, но не как печатаются функции, которые она вызывает (это то, что я предполагаю, что вы после этого).
Я думаю, что это ошибка в GDB
, пожалуйста, напишите ошибку в bugzilla.
Ответ 2
Я не помню, чтобы когда-либо найти автоматический способ для gdb сделать это. Я всегда просто копировал и вставлял символ и запускал его через утилиту Linux c++filt
для демонстрации.
Ответ 3
GDB показывает оригинальное имя функции без искажений на модели разборки ::
Вы должны делать эти шаги каждый раз, когда собираетесь отлаживать.
1. установить печать demangle на
2. установите print asm-demangle на
В противном случае вы можете создать файл vim ~/.gdbinit, например, файл ~/.vimrc, и настроить следующие шаги, чтобы вам не приходилось выполнять каждый раз.
1 комплект печати довольно на
2 комплекта печати на раскладе
3 комплекта печати asm-demangle на