GDBでレジスタ値を印刷する方法は?


191

%eaxand の値を出力するにはどうすればよい%ebpですか?

(gdb) p $eax
$1 = void

8
layout reggdbにすべての整数レジスタとフラグレジスタのテーブルを表示させ、前の命令によって変更されたレジスタを強調表示するために使用します。たとえば、stackoverflow.com / tags / x86 / infoを参照してください。
Peter Cordes

回答:


231

info registersすべてのレジスタを表示します。info registers eaxレジスターのみを示しますeax。コマンドは次のように省略できますi r


取得:無効なレジスタ `%eax 'そして「情報レジスタ」だけを実行してもeaxは表示されません。それでも、EXC_BAD_ACCESS信号が命令で生成されたIDEのコードアセンブリを調べています。test%eax、%eaxこれは、gdbを実行しているXCodeにあります。gdbがeaxレジスタを報告しないのはなぜですか?
NoahR 2010年

1
同じ問題:%eaxはコードにありますが、印刷$ eaxは無効を示します。
Ruslan Yushchenko

5
ブリジットの答えは私のために働きます。geekosaurの答えはほぼ正しいですが、%記号を省略する必要があるため、特定のレジスターのコマンドはinfo registers eaxです。ただし、これがgdbのバージョンによって異なるかどうかはわかりません。
ケヴィン

私はlldbについても同じことを探していたので、次の点に注意してください。lldbの場合、コマンドはregister read [eax]
holgac

コードをステップ実行しながらレジスタ値を継続的に表示する場合は、を使用できますdisplay。たとえばdisplay $eax
srgsanky

50

GDBで特定のレジスタを印刷する場合は、%記号を省略する必要があります。例えば、

info registers eip

実行可能ファイルが64ビットの場合、レジスタはrで始まります。それらをeで開始することは無効です。

info registers rip

これらは以下のように省略できます。

i r rip

37

もあります:

info all-registers

次に、関心のあるレジスタ名を取得できます-プラットフォーム固有のレジスタ(ARM上のNEON Q ...など)を見つけるのに非常に便利です。


3
これは、存在を知らなかったレジスターについて教えてくれました:-)
Ciro Santilli郝海东冠状病六四事件法轮機能

1
私のマシンでは、このプリントeaxecxおよびその他の標準的なレジスタは、によって隠さinfo registers。これはおそらく受け入れられる答えになるはずです。
EntangledLoops 2016

15
  • 一度だけ確認したい場合は、info registersレジスタを表示します。
  • たとえば、1つのレジスタのみを監視したい場合はdisplay $esp、gdbコマンドラインでespレジスタの表示を続けます。
  • すべてのレジスタを監視したい場合layout regsは、TUIモードでレジスタの表示を続行します。

12

Gdbコマンド

  • i r <register_name>:単一のレジスタを出力しますi r raxi 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*)を出力します

aall)とffloat)以外の他のレジスタグループは、次のようにして見つけることができます。

maint print reggroups

次のドキュメントに記載されています:https : //sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

ヒント

  • xmm0xmm15は128ビットで、ほとんどすべての現代のマシンに搭載されており、1999年にリリースされました。
  • ymm0ymm15は256ビットで、新しいマシンには通常それがあり、2011年にリリースされます。
  • zmm0zmm31は512ビットで、通常のPCにはおそらく(2016年のように)ありません。2013年にリリースされ、主にこれまでサーバーで使用されていました。
  • xmm / ymm / zmmの1つのシリアルのみが表示されます。これは、それらが異なるモードの同じレジスタであるためです。私のマシンではymmが表示されます。

6

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つでない限り、便利な変数として使用できます。

マシンレジスタの内容は、式で、 '$'で始まる名前の変数として参照できます。レジスタの名前はマシンごとに異なります。情報レジスタを使用して、マシンで使用されている名前を確認します。

しかし、私はこれまでのところ、制御レジスターにはあまり運がありません。OSDev2012 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浮動小数点レジスタ

参照:https : //reverseengineering.stackexchange.com/questions/8992/floating-point-registers-on-arm/20623#20623


2
この$構文の式でレジスタを使用できるのは素晴らしいことです。
1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.