代码之家  ›  专栏  ›  技术社区  ›  Rhys Ulerich

我如何截断由GDB的反汇编命令所显示的被损坏的C++标识符?

  •  3
  • Rhys Ulerich  · 技术社区  · 15 年前

    gdb的disassemble命令对于短的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 回复  |  直到 14 年前
        1
  •  1
  •   Employed Russian    15 年前

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

    这里是 patch 它引入了“简短的形式”。

        2
  •  1
  •   jonner    15 年前

    这并不能真正回答你的问题,但你至少可以把事情弄清楚,让它们不那么难看:

    set print asm-demangle on

    推荐文章