Wie drucke ich Registerwerte in GDB?


191

Wie drucke ich den Wert von %eaxund %ebp?

(gdb) p $eax
$1 = void

8
Verwenden Sie layout regdiese 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 .
Peter Cordes

Antworten:


231

info registerszeigt alle Register; info registers eaxzeigt nur das Register eax. Der Befehl kann als abgekürzt werdeni r


Ich bekomme: Ungültiges Register `% eax 'Und wenn ich nur" Info-Register "mache, wird eax nicht angezeigt. Ich betrachte jedoch meine Code-Assembly in der IDE, in der ein EXC_BAD_ACCESS-Signal mit der Anweisung generiert wurde: test% eax,% eax Dies ist in XCode, in dem gdb ausgeführt wird. Warum meldet gdb das eax-Register nicht?
NoahR

1
Gleiches Problem:% eax ist im Code enthalten, aber print $ eax zeigt void an.
Ruslan Yushchenko

5
Bridgettes Antwort funktioniert für mich. Die Antwort von Geekosaur ist meistens richtig, aber Sie müssen das% -Zeichen weglassen, damit der Befehl für ein bestimmtes Register lautet info registers eax. Ich bin mir jedoch nicht sicher, ob dies für verschiedene Versionen von gdb unterschiedlich ist.
Kevin

Ich habe nach dem gleichen Thema für lldb gesucht, also lassen Sie mich nur Folgendes beachten: Für lldb lautet der Befehlregister read [eax]
holgac

Wenn Sie die Registerwerte kontinuierlich anzeigen möchten, während Sie den Code durchlaufen, können Sie ihn verwenden display. Zum Beispiel display $eax.
srgsanky

50

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

37

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


3
Dies lehrte über Register, von denen ich nicht wusste, dass sie existieren :-)
Ciro Santilli 法轮功 冠状 病 病 六四 法轮功

1
Auf meinem Computer werden diese und andere Standardregister gedruckt eax, ecxdie von verborgen sind info registers. Dies sollte wahrscheinlich die akzeptierte Antwort sein.
EntangledLoops

15
  • Wenn Sie es nur einmal überprüfen möchten, info registerszeigen Sie die Register an.
  • Wenn Sie beispielsweise nur ein Register überwachen möchten, display $espfahren Sie mit der Anzeige von Esp-Registern in der GDB-Befehlszeile fort.
  • Wenn Sie alle Register überwachen möchten, layout regsfahren Sie mit der Anzeige der Register im TUI-Modus fort.

12

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-7und 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.
  • Es wird nur eine Serie von xmm / ymm / zmm angezeigt, da es sich um dieselben Register in verschiedenen Modi handelt. Auf meiner Maschine wird ymm angezeigt.

6

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


2
Es ist großartig, Register in Ausdrücken mit dieser $Syntax verwenden zu können.
Remcycles
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.