2017-02-17 6 views
2

私が実際にやっていることは、ウォッチポイントを1ビットの設定またはクリアに設定しようとしていることです。ビットを含むワードにウォッチポイントを設定して、それを* word &マスク(設定の場合は&のマスク)で条件付きにすることで行います。gdbのウォッチポイントの古い値と新しい値へのプログラムによるアクセス

問題は、他のビット同じ単語の中で変更されてもよく、条件はすでに一致する可能性があります。私が古い値と新しい値を持っていれば、($ old^$ new)&マスクという条件を設定できます。

私はpython gdb.Breakpointクラスを見ましたが、この情報も受信していないようです。

私は夢中になり、* wordの値が変わるたびに現在の値を記録するコマンドリストを設定し、それを$ oldとして使用するとします。しかし、私はこれを使っている時間の半分、実際にはrrを使っているので、私は後方に行くかもしれません。

答えて

3

gdbでこれらの値を直接取得する方法はありません。長年にわたりwish-list bug(正確な例を例として...)でした。情報は、ブレークポイントに関連付けられたstruct bpstatsオブジェクトのold_valフィールドに格納されています。これは古い値を印刷するためにのみ使用され、他の場所には公開されません。

便利な変数またはPythonを介してこの値を公開するようにgdbを変更することもできます。

私は夢中になり、* wordの値が変わるたびに現在の値を記録するコマンドリストを設定し、それを$ oldとして使用するとします。しかし、私はこれを使っている時間の半分、実際にはrrを使っているので、私は後方に行くかもしれません。

これは可能です。スクリプトは現在の実行方向を確認できます。主な問題は、このウォッチポイントを作成するとき、またはウォッチポイントを無効にしてから再度有効にした後に、保存された値をリセットすることです。

+0

私は、最初の行に '++ depth 'があり、最後に' --depth'(void関数、それ以外の戻り値なし)を持つ関数を持っています。私は、この関数の開始時と終了時にPythonコード( 'gdb.Breakpoint'のサブクラス)を実行したいと思います。関数が返すブレークポイントを設定するためのトリック(https://stackoverflow.com/questions/3649468/)は私にとってはうまくいかなかったので、変数「depth」にウォッチポイントを設定することが効果的かもしれないと思いました私は '++ depth 'と' --depth'(function enterとexit)を区別できません。いくつかの回避策がありますか? – ShreevatsaR

+0

私は、関数beginでブレークポイントと深度変数でウォッチポイントの両方を設定し、これらのいずれかがトリガされたすべての時間を記録するグローバル状態(基本的にスタック)を維持するトリックを見つけました。関数ブレークポイントでは '('をスタック上に押し、ウォッチポイントでは最後のトリガーが関数であればスタックに '|'を押してください。あなたがそれを終了していることを知っているなど)しかし、私はそれほど狂っていないものが存在すると想像します。 – ShreevatsaR

関連する問題