Antworten:
info registers
zeigt alle Register; info registers eax
zeigt nur das Register eax
. Der Befehl kann als abgekürzt werdeni r
info registers eax
. Ich bin mir jedoch nicht sicher, ob dies für verschiedene Versionen von gdb unterschiedlich ist.
register read [eax]
display
. Zum Beispiel display $eax
.
Wenn Sie versuchen, ein bestimmtes Register in GDB zu drucken, müssen Sie das% -Zeichen weglassen. Beispielsweise,
info registers eip
Wenn Ihre ausführbare Datei 64 Bit ist, beginnen die Register mit r. Das Starten mit e ist ungültig.
info registers rip
Diese können abgekürzt werden als:
i r rip
Es gibt auch:
info all-registers
Dann können Sie den Registernamen erhalten, an dem Sie interessiert sind - sehr nützlich, um plattformspezifische Register zu finden (wie NEON Q ... auf ARM).
eax
, ecx
die von verborgen sind info registers
. Dies sollte wahrscheinlich die akzeptierte Antwort sein.
info registers
zeigen Sie die Register an.display $esp
fahren Sie mit der Anzeige von Esp-Registern in der GDB-Befehlszeile fort.layout regs
fahren Sie mit der Anzeige der Register im TUI-Modus fort.Gdb-Befehle :
i r <register_name>
: Drucken Sie ein einzelnes Register, z i r rax
.i r eax
i r <register_name_1> <register_name_2> ...
: mehrere Register drucken, z i r rdi rsi
.i r
: Alle Register außer Gleitkomma- und Vektorregister (xmm, ymm, zmm) drucken.i r a
: Alle Register drucken, Gleitkomma- und Vektorregister (xmm, ymm, zmm) einschließen.i r f
: druckt alle schwebenden FPU-Register ( st0-7
und einige andere f*
)Weitere Registergruppen neben a
( all
) und f
( float
) finden Sie unter:
maint print reggroups
wie dokumentiert unter: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
Tipps :
xmm0
~ xmm15
, sind 128 Bit, fast jede moderne Maschine hat es, sie werden 1999 veröffentlicht.ymm0
~ ymm15
, sind 256 Bit, neue Maschine haben es normalerweise, sie werden im Jahr 2011 veröffentlicht.zmm0
~ zmm31
, sind 512 Bit, normale PCs haben es wahrscheinlich nicht ( wie im Jahr 2016 ), sie werden 2013 veröffentlicht und bisher hauptsächlich auf Servern verwendet.p $eax
funktioniert ab GDB 7.7.1
Ab GDB 7.7.1 funktioniert der Befehl, den Sie ausprobiert haben:
set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1
Diese Syntax kann auch verwendet werden, um zwischen verschiedenen Gewerkschaftsmitgliedern zu wählen, z. B. für ARM-Gleitkommaregister, die entweder Gleitkomma- oder Ganzzahlen sein können:
p $s0.f
p $s0.u
Aus den Dokumenten :
Jeder Name, dem '$' vorangestellt ist, kann für eine Convenience-Variable verwendet werden, es sei denn, es handelt sich um einen der vordefinierten maschinenspezifischen Registernamen.
und :
Sie können Maschinenregisterinhalte in Ausdrücken als Variablen mit Namen bezeichnen, die mit '$' beginnen. Die Namen der Register sind für jede Maschine unterschiedlich. Verwenden Sie Inforegister, um die auf Ihrem Computer verwendeten Namen anzuzeigen.
Aber ich hatte bisher nicht viel Glück mit Kontrollregistern: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 2005 Funktionsanforderung https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I
ARM-Gleitkommaregister
Siehe: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623
$
Syntax verwenden zu können.
layout reg
diese Option, damit gdb eine Tabelle aller Ganzzahl- und Flag-Register anzeigt und die durch die vorherige Anweisung geänderten Register hervorhebt. Siehe zum Beispiel stackoverflow.com/tags/x86/info .