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

hóa ra làLàm thế nào để làm cho gdb hiển thị tên hàm không mangling ban đầu trên mô hình tháo gỡ?

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. 

Tất cả các disassemblies chỉ hiển thị các tên hàm manglinged, nhưng nó không eaiser cho lập trình viên để de-mangling và nhận được tên hàm ban đầu với các bận tâm để gõ info symbol address cho mỗi mangling tên đáp ứng, do đó, có bất kỳ phương pháp mà có thể làm cho gdb hiển thị tên không mangling chức năng trên mô hình lắp ráp?

Trả lời

18

Bạn có thể làm maint demangle _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc tại lời nhắc (gdb).

Sổ tay nói:

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

Thật không may, nó không xuất hiện để làm việc:

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

Bối cảnh thay đổi cách các chức năng hiện nay được in, nhưng không phải là cách các chức năng nó gọi được in (đó là những gì tôi giả sử bạn đang sau).

Tôi nghĩ rằng đó là lỗi trong GDB, vui lòng gửi lỗi trong bugzilla.

+0

nhưng nó hoạt động tốt trong cổng MinGW của tôi. – Jichao

+1

Có một báo cáo lỗi, https://sourceware.org/bugzilla/show_bug.cgi?id=12021. Điều này chỉ không hoạt động đối với các ký hiệu có hậu tố @plt. – Ruslan

+0

Hoạt động tuyệt vời trong năm 2015. –

3

Tôi không nhớ đã bao giờ tìm cách tự động cho gdb để làm điều đó. Tôi luôn luôn chỉ sao chép và dán biểu tượng và chạy nó thông qua tiện ích Linux c++filt để tháo gỡ.

+0

có sự khác biệt nào giữa C++ filt và biểu tượng thông tin không? – Jichao

Các vấn đề liên quan