1. ホーム
  2. c++

[解決済み】GDBで「メモリアクセス」にブレークポイントを設定することはできますか?

2022-04-18 01:02:12

質問

gdbでアプリケーションを実行していますが、特定の変数がアクセス/変更されるたびにブレークポイントを設定したいのです。これを行うための良い方法はありますか?また、C/C++で変数がいつ変更されるかを監視する他の方法にも興味があります。

どのように解決するのですか?

時計 は書き込み時のみブレークします。 rwatch は読み込み時にブレークさせ、そして アウォッチ 読み書きの際にブレークさせることができます。

メモリロケーションに読み取り用のウォッチポイントを設定できます。

gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface

しかし、rwatch と awatch コマンドには、一つの制限があります。 を式で表すことができます。

gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.

だから、自分で拡張する必要があるのです。

gdb$ print $ebx 
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f

Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()

編集する あ、ちなみに。どちらかのハードウェアが必要です またはソフトウェアサポート . ソフトウェアの方が明らかに遅いです。お使いのOSがハードウェアウォッチポイントをサポートしているかどうかを調べるには、以下のサイトを参照してください。 can-use-hw-watchpoints 環境設定

gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.