4

GDB の逆アセンブル コマンドは、mainなどの短い C 識別子に適しています。長くて壊れた 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

CVS からの現在の GDB は、逆アセンブリに関数が 1 つしかないことを認識している場合、希望どおりに動作します。

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

これが「ショートフォーム」を導入したパッチです。

于 2009-10-29T05:36:11.080 に答える
1

これは実際にはあなたの質問に答えるものではありませんが、少なくとも物事をデマングルして少し醜くすることができるかもしれません:

set print asm-demangle on

于 2009-10-29T04:16:27.873 に答える