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.