Come posso troncare gli identificatori C ++ alterati mostrati dal comando disassemble di GDB?
-
08-07-2019 - |
Domanda
Il comando di disassemblaggio di GDB è utile per identificatori C brevi, ad es. main . Per gli identificatori C ++ lunghi e distorti, la verbosità è eccessiva. Ad esempio, usando icpc vedo risultati come
(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
Le visualizzazioni così lunghe sono fastidiose nella CLI. Rendono l'assemblaggio TUI di GDB quasi tutto inutile.
C'è un modo per dire a GDB di mostrare un identificatore troncato? Di 'di tagliare tutti tranne 50 caratteri?
Soluzione
Il GDB corrente di CVS si comporta come desideri quando sa che esiste una sola funzione nello smontaggio:
(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.
Quando GDB non è in grado di sapere se lo smontaggio attraverserà o meno il limite della funzione, stampa comunque il "lungo" forma:
(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.
Ecco la patch che ha introdotto la " forma breve " ;.
Altri suggerimenti
Questo in realtà non risponde alla tua domanda, ma potresti essere almeno in grado di districare le cose per renderle un po 'meno brutte:
imposta print asm-demangle su