%eax
および%ebp
の値を印刷するにはどうすればよいですか?
(gdb) p $eax
$1 = void
info registers
はすべてのレジスタを表示します。 info registers eax
は、レジスタeax
のみを表示します。コマンドはi r
と短縮できます。
GDBの特定のレジスターを印刷する場合は、%記号を省略する必要があります。例えば、
info registers eip
実行可能ファイルが64ビットの場合、レジスタはrで始まります。 eで開始することは無効です。
info registers rip
これらは次のように短縮できます。
i r rip
もあります:
info all-registers
次に、興味のあるレジスタ名を取得できます。プラットフォーム固有のレジスタ(ARMのNEON Q ...など)を見つけるのに非常に便利です。
info registers
がレジスタを表示します。display $esp
continueはgdbコマンドラインにespレジスタを表示します。layout regs
はTUIモードでレジスタの表示を続行します。Gdbコマンド:
i r <register_name>
:単一のレジスターを出力します、例:i r rax
、i r eax
i r <register_name_1> <register_name_2> ...
:複数のレジスターを印刷します。例:i r rdi rsi
、i r
:浮動小数点およびベクトルレジスタ(xmm、ymm、zmm)を除くすべてのレジスタを出力します。i r a
:すべてのレジスタを出力し、浮動小数点とベクトルレジスタ(xmm、ymm、zmm)を含めます。i r f
:すべてのFPUフローティングレジスタ(st0-7
および他のいくつかのf*
)を出力しますa
(all
)およびf
(float
)以外のレジスタグループは、次のもので見つけることができます。
maint print reggroups
https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
ヒント:
xmm0
〜xmm15
は128ビットで、ほとんどすべての最新のマシンに搭載されており、1999年にリリースされました。ymm0
〜ymm15
は256ビットで、新しいマシンには通常それがあり、2011年にリリースされます。zmm0
〜zmm31
は512ビットで、通常のPCにはおそらくない(2016年)。2013年にリリースされ、主にサーバーで使用されています。p $eax
はGDB 7.7.1以降で動作します
GDB 7.7.1の時点で、試したコマンドは機能します。
set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1
この構文は、異なるユニオンメンバーから選択するためにも使用できます。 ARM浮動小数点レジスター(浮動小数点または整数のいずれか):
p $s0.f
p $s0.u
ドキュメント から:
事前定義されたマシン固有のレジスタ名の1つでない限り、「$」が前に付いた名前はすべて、便利な変数に使用できます。
および :
式で、マシンレジスタの内容を、「$」で始まる名前の変数として参照できます。レジスタの名前はマシンごとに異なります。情報レジスタを使用して、マシンで使用されている名前を確認します。
しかし、私はこれまでのところ制御レジスタにそれほど運がありませんでした:OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 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
ARM浮動小数点レジスター