如何截断GDB的反汇编命令显示的错位C ++标识符?

时间:2009-10-28 17:57:47

标签: c++ gdb name-mangling

GDB的反汇编命令适用于短C标识符,例如main。对于冗长的,受损的C ++标识符,详细程度是过度的。例如,使用icpc我看到的结果如

(gdb) disassemble 0x49de2f 0x49de5b
Dump of assembler code from 0x49de2f to 0x49de5b:
0x000000000049de2f <_ZN5pecos8suzerain16fftw_multi_array6detail18c2c_buffer_processIPA2_dPKSt7complexIdEilNS2_26complex_copy_differentiateIS4_EEEEvT_T1_T2_T0_SD_SE_RKT3_+167>: mov    0x18(%rsp),%rsi

在CLI中显示长时间的烦人行为。它们使GDB的TUI组件显示无用。

有没有办法告诉GDB显示截断的标识符?说剪辑除了50个字符外?

2 个答案:

答案 0 :(得分:1)

这并没有真正回答你的问题,但你可能至少可以解决问题,使它们变得不那么丑陋了:

set print asm-demangle on

答案 1 :(得分:1)

当CVS知道反汇编中只有一个函数时,CVS中的当前GDB会以您想要的方式运行:

(gdb) disas 0x000000000040071c
Dump of assembler code for function _ZNKSt8_Rb_treeIPiSt4pairIKS0_S0_ESt10_Select1stIS3_ESt4lessIS0_ESaIS3_EE21_M_get_Node_allocatorEv:
   0x000000000040071c <+0>: push   %rbp
   0x000000000040071d <+1>: mov    %rsp,%rbp
   0x0000000000400720 <+4>: mov    %rdi,-0x8(%rbp)
   0x0000000000400724 <+8>: mov    -0x8(%rbp),%rax
   0x0000000000400728 <+12>:    leaveq 
   0x0000000000400729 <+13>:    retq   
End of assembler dump.

当GDB无法知道反汇编是否会越过函数边界时,它仍会打印出“长”形式:

(gdb) disas 0x000000000040071c 0x000000000040071c+1
Dump of assembler code from 0x40071c to 0x40071d:
   0x000000000040071c <_ZNKSt8_Rb_treeIPiSt4pairIKS0_S0_ESt10_Select1stIS3_ESt4lessIS0_ESaIS3_EE21_M_get_Node_allocatorEv+0>:   push   %rbp
End of assembler dump.

以下是引入“简短形式”的patch