Mostrar instruções de montagem atuais no GDB

179

Estou fazendo alguma depuração em nível de assembly no GDB. Existe uma maneira de fazer com que o GDB me mostre a instrução de montagem atual da mesma maneira que mostra a linha de origem atual? A saída padrão após cada comando é semelhante a esta:

0x0001433f      990         Foo::bar(p);

Isso me fornece o endereço da instrução atual, mas tenho que continuar consultando a saída de disassemblepara ver qual instrução estou executando no momento.

JSB ձոգչ
fonte

Respostas:

314

Você pode mudar para o layout da montagem no GDB:

(gdb) layout asm

Veja aqui para mais informações. A instrução de montagem atual será mostrada na janela de montagem.

   ┌───────────────────────────────────────────────────────────────────────────┐
   │0x7ffff740d756 <__libc_start_main+214>  mov    0x39670b(%rip),%rax        #│
   │0x7ffff740d75d <__libc_start_main+221>  mov    0x8(%rsp),%rsi              │
   │0x7ffff740d762 <__libc_start_main+226>  mov    0x14(%rsp),%edi             │
   │0x7ffff740d766 <__libc_start_main+230>  mov    (%rax),%rdx                 │
   │0x7ffff740d769 <__libc_start_main+233>  callq  *0x18(%rsp)                 │
  >│0x7ffff740d76d <__libc_start_main+237>  mov    %eax,%edi                   │
   │0x7ffff740d76f <__libc_start_main+239>  callq  0x7ffff7427970 <exit>       │
   │0x7ffff740d774 <__libc_start_main+244>  xor    %edx,%edx                   │
   │0x7ffff740d776 <__libc_start_main+246>  jmpq   0x7ffff740d6b9 <__libc_start│
   │0x7ffff740d77b <__libc_start_main+251>  mov    0x39ca2e(%rip),%rax        #│
   │0x7ffff740d782 <__libc_start_main+258>  ror    $0x11,%rax                  │
   │0x7ffff740d786 <__libc_start_main+262>  xor    %fs:0x30,%rax               │
   │0x7ffff740d78f <__libc_start_main+271>  callq  *%rax                       │
   └───────────────────────────────────────────────────────────────────────────┘
multi-thre process 3718 In: __libc_start_main     Line: ??   PC: 0x7ffff740d76d
#3  0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00007ffff74671ff in _IO_file_overflow ()
   from /lib/x86_64-linux-gnu/libc.so.6
#5  0x0000000000408756 in ?? ()
#6  0x0000000000403980 in ?? ()
#7  0x00007ffff740d76d in __libc_start_main ()
   from /lib/x86_64-linux-gnu/libc.so.6
(gdb)
ks1322
fonte
1
@greatwolf, parece que você não tem suporte para você no seu gdb. Consulte esta pergunta para obter mais informações: stackoverflow.com/q/6706838/72178 .
#
9
Arrumado! Agora posso ter uma janela semelhante para os registros? Na verdade eu posso:layout regs
Jens
Veja também os documentos do gdb para outros comandos da TUI , como tui reg vectormostrar os registros do vetor em vez dos registros inteiros. (Mas nem sempre é muito utilizável, porque não permite escolher apenas o.v8_int16 algo ou algo assim, a exibição é uma grande bagunça.) Consulte o wiki da tag x86 para obter um tutorial rápido sobre a depuração do asm.
22616 Peter Cordes
Trata-se de um recurso e saída inúteis. Os nomes alterados do C ++ são muito longos e tudo o que estou tentando exibir fica fora da tela à direita. Que decisão estúpida (não exibir o ASM por padrão quando si) e que recurso inútil (janela de visualização que não exibe as informações necessárias). Não há nenhum sentido em baixo votar esta resposta desde que você é apenas o mensageiro ...
JWW
1
similarmente, ·layout src para ver o código fonte durante a depuração, e também worthing saída lembrar este modo porCTRL+x+a
Baiyan Huang
149

Você pode fazer

display/i $pc

e toda vez que o GDB parar, exibirá a desmontagem da próxima instrução.

GDB-7.0também suporta set disassemble-next-line on, que desmontará toda a próxima linha e fornecerá mais do contexto da desmontagem.

Russo empregado
fonte
1
Como habilitamos esse recurso ao usar si(mas não s)?
JWW
54

O comando

x/i $pc

pode ser definido para ser executado o tempo todo usando o mecanismo de configuração usual.

bmargulies
fonte
29
E x/ni $pcpara visualizar as próximas n instruções, que geralmente são bastante úteis.
Stephen Canon
48

Configurando a seguinte opção:

set  disassemble-next-line on
show disassemble-next-line

Fornecerá resultados parecidos com este:

(gdb) stepi
0x000002ce in ResetISR () at startup_gcc.c:245
245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
=> 0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
   0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
(gdb) stepi
0x000002d0  245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
   0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
=> 0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
Bob Ensink
fonte
Esta opção parece não existir na minha instalação. Foi removido?
fuz
2
@fuz Mais provavelmente, o gdb é velho
tbodt
@fuz presente pelo menos no GDB 8.1 no Ubuntu 18.04.
Ciro Santilli respondeu
habilidade muito útil
DaSqy Stc
1
show disassemble-next-line is for test, para imprimir o status da bandeira, ligado ou desligado
Sam
30

Se você deseja que as próximas instruções sejam exibidas automaticamente ao percorrer o programa, use o comando display da seguinte maneira -

display /3i $pc

O item acima exibirá 3 instruções sempre que um ponto de interrupção for atingido ou quando você pisar o programa em uma única etapa.

Mais detalhes na entrada do blog aqui .

mohit
fonte
23

De dentro do gdb, pressione Ctrl x 2e a tela será dividida em 3 partes.

A primeira parte mostrará o código normal no idioma de alto nível.

O segundo mostrará a montagem equivalente e correspondente instruction Pointer .

O terceiro apresentará o gdbprompt normal para inserir comandos.

Veja a captura de tela

abhi
fonte
Não consegui iniciá-lo Ctrl-X 2, mas parece o gdb -tuimodo, o que é ótimo.
Ciro Santilli #
7
Isso também pode ser acessado a layout splitpartir do prompt gdb.
chucksmash
22

Painel GDB

https://github.com/cyrus-and/gdb-dashboard

Essa configuração do GDB usa a API Python oficial do GDB para nos mostrar o que queremos sempre que o GDB para depois, por exemplo next , muito parecido com o TUI.

No entanto, descobri que essa implementação é uma alternativa mais robusta e configurável ao modo GDB TUI interno, conforme explicado em: exibição dividida gdb com código

Por exemplo, podemos configurar o GDB Dashboard para mostrar desmontagem, origem, registros e empilhamento com:

dashboard -layout source assembly registers stack

Aqui está o que parece se você ativar todas as visualizações disponíveis:

insira a descrição da imagem aqui

Perguntas relacionadas:

Ciro Santilli adicionou uma nova foto
fonte
1
@ downvoters: explique para que eu possa aprender e melhorar as informações. Eu acredito que esta é uma alternativa superior para a resposta atualmente aceita TUI: stackoverflow.com/a/2015523/895245
Ciro Santilli郝海东冠状病六四事件法轮功