Como imprimir valores de registro no GDB?

191

Como imprimo o valor de %eaxe %ebp?

(gdb) p $eax
$1 = void
assem
fonte
8
Use layout regpara que o gdb mostre uma tabela de todos os registros de número inteiro e sinalizador, destacando aquele (s) alterado (s) pela instrução anterior. Veja stackoverflow.com/tags/x86/info, por exemplo.
22815 Peter Cordes

Respostas:

231

info registersmostra todos os registros; info registers eaxmostra apenas o registro eax. O comando pode ser abreviado comoi r

geekosaur
fonte
Eu recebo: Registro inválido `% eax 'E se eu apenas fizer" registros de informações ", o eax não aparecerá. No entanto, estou observando meu assembly de código no IDE, onde um sinal EXC_BAD_ACCESS foi gerado com a instrução: test% eax,% eax Isso está no XCode executando o gdb. Por que o gdb não está relatando o registro eax?
NoahR 20/10
1
Mesmo problema:% eax está no código, mas imprime $ eax mostra nulo.
Ruslan Yushchenko
5
A resposta de Bridgette funciona para mim. A resposta do geekosaur está correta, mas você precisa omitir o sinal de%, então o comando para um registro específico é info registers eax. Não tenho certeza se isso é diferente para diferentes versões do gdb.
Kevin
Eu estava procurando a mesma coisa para LLDB, então deixem-me apenas observar que: para LLDB, o comando éregister read [eax]
holgac
Se você deseja exibir os valores do registro continuamente enquanto você percorre o código, pode usar display. Por exemplo display $eax.
Srgsanky 18/05
50

Se você estiver tentando imprimir um registro específico no GDB, precisará omitir o sinal de%. Por exemplo,

info registers eip

Se o seu executável é de 64 bits, os registros começam com r. Iniciá-los com e não é válido.

info registers rip

Esses podem ser abreviados para:

i r rip
Bridgette
fonte
37

Há também:

info all-registers

Em seguida, você pode obter o nome do registro no qual está interessado - muito útil para encontrar registros específicos da plataforma (como NEON Q ... no ARM).

você não
fonte
3
Este ensinou ser sobre registros que eu não sabia existir :-)
Ciro Santilli郝海东冠状病六四事件法轮功
1
Na minha máquina, este estampas eax, ecxe outros registros padrão escondido por info registers. Provavelmente essa deve ser a resposta aceita.
precisa
15
  • Se você quiser apenas checar uma vez, info registersmostre os registros.
  • Se você quiser apenas assistir a um registro, por exemplo, display $espcontinue exibindo esp registradores na linha de comando gdb.
  • Se quiser assistir a todos os registros, layout regscontinue show registers, com o modo TUI.
liuyang1
fonte
12

Comandos Gdb :

  • i r <register_name>: imprime um único registro, por exemplo i r rax,i r eax
  • i r <register_name_1> <register_name_2> ...: imprime vários registros, por exemplo i r rdi rsi,
  • i r: imprime todos os registros, exceto o ponto flutuante e o registro vetorial (xmm, ymm, zmm).
  • i r a: imprima todos os registros, inclua ponto flutuante e registro vetorial (xmm, ymm, zmm).
  • i r f: imprime todos os registros flutuantes da FPU ( st0-7e alguns outros f*)

Outros grupos de registro além de a( all) e f( float) podem ser encontrados com:

maint print reggroups

conforme documentado em: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

Dicas :

  • xmm0~ xmm15, são 128 bits, quase todas as máquinas modernas possuem, são lançadas em 1999.
  • ymm0~ ymm15, são 256 bits, as novas máquinas costumam ter, são lançadas em 2011.
  • zmm0~ zmm31, são 512 bits, o PC normal provavelmente não o possui ( como no ano de 2016 ), eles são lançados em 2013 e usados ​​principalmente em servidores até agora.
  • Apenas uma série de xmm / ymm / zmm será mostrada, porque são os mesmos registros em modo diferente. Na minha máquina, ymm é mostrado.
Eric Wang
fonte
6

p $eax funciona a partir do GDB 7.7.1

No GDB 7.7.1, o comando que você tentou funciona:

set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1

Essa sintaxe também pode ser usada para selecionar entre diferentes membros da união, por exemplo, para registros de ponto flutuante do ARM que podem ser ponto flutuante ou números inteiros:

p $s0.f
p $s0.u

Dos documentos :

Qualquer nome precedido por '$' pode ser usado para uma variável de conveniência, a menos que seja um dos nomes de registro específicos da máquina predefinidos.

e :

Você pode consultar o conteúdo do registro da máquina, em expressões, como variáveis ​​com nomes começando com '$'. Os nomes dos registradores são diferentes para cada máquina; use os registradores de informações para ver os nomes usados ​​na sua máquina.

Mas ainda não tive muita sorte com os registros de controle: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Solicitação de recurso de 2005 https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

Registradores de ponto flutuante ARM

Consulte: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623

Ciro Santilli adicionou uma nova foto
fonte
2
É ótimo poder usar registros em expressões com esta $sintaxe.
remcycles