4

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 个字符之外的所有字符?

4

2 回答 2

1

这并不能真正回答您的问题,但是您至少可以对事物进行拆解以使它们变得不那么难看:

set print asm-demangle on

于 2009-10-29T04:16:27.873 回答
1

当 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 无法知道反汇编是否会跨越函数边界时,它仍然会打印“long”形式:

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

这是引入“短格式”的补丁。

于 2009-10-29T05:36:11.080 回答