Como imprimir valores de registro no GDB?


Respostas:


231

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


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

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


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.

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.

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


2
É ótimo poder usar registros em expressões com esta $sintaxe.
remcycles
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.