GDBでは、特定のメモリアドレスを読み書きするときに起動するブレークポイントを設定することができます。 どのように動作するのだろうか。 GDBにはプロセスメモリのコピーがあり、各命令の間に何が変わったのかを確認しますか?それとも、そのためのシステムコールまたはカーネル機能ですか?GDB rwatchコマンドとawatchコマンドはどのように動作しますか?
(インテルのx86 32ビットと64ビットアーキテクチャ)
GDBでは、特定のメモリアドレスを読み書きするときに起動するブレークポイントを設定することができます。 どのように動作するのだろうか。 GDBにはプロセスメモリのコピーがあり、各命令の間に何が変わったのかを確認しますか?それとも、そのためのシステムコールまたはカーネル機能ですか?GDB rwatchコマンドとawatchコマンドはどのように動作しますか?
(インテルのx86 32ビットと64ビットアーキテクチャ)
私はそれがどのように機能するか疑問に思って。
ソフトウェアウォッチポイントとハードウェアウォッチポイント(いくつかのアーキテクチャでのみ利用可能)があります。
ソフトウェアウォッチポイントは、アプリケーションをシングルステップ実行し、命令ごとに値が変更されたかどうかを確認することで機能します。これらは非常に遅く(1000倍遅く)、実際にはおもちゃプログラム以外では使用できません。彼らはまた、アクセスを検出することはできません、監視されている場所の値の変更のみ。
ハードウェアウォッチポイントには、プロセッサのサポートが必要です。 Intel x86チップには、debug registersがあり、アクセス(awatch
,)または特定のメモリ位置の変更(watch
)を監視するようにプログラムすることができます。プロセッサが関心のある場所にアクセスしたことを検出すると、OSはデバッグ例外を発生させ、OSはその信号を信号に変換し、ターゲットが認識する前にデバッガに信号を与えます。
HWウォッチポイントはネイティブスピードで実行されますが、(x86では)最大4つの別個のアドレスしか持てません(実際には2以上は必要ありません)。
現在の命令を実行すると、eipアドレスで時計が読み込まれますか?
です。あなたは自明にこれに答えることができます。やってみなよ。
スタックを押してスタックメモリアドレスに書き込みをしますか?
同様に、
現在の命令の実行は、時計をeipアドレスで読み上げますか?スタック・メモリ・アドレスへの書き込みをスタック・ファイヤー・プッシュしますか? – Bob5421
@ Bob5421回答が更新されました。あなたは本当に2分のすべてを取る答えを見つける質問をする必要はありません。 –
対象とは何ですか?ターゲットアーキテクチャとgdbの実行方法(またはリモート) x86 + Linuxとgdbは同じマシンにありますか? gdbの "ウォッチポイント"機能をチェックしてください:https://sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html - ハードウェアデバッグレジスタ(一部のターゲットではハードウェアウォッチポイント)や低速のソフトウェアウォッチポイントを使用して動作します。プログラムをシングルステッピングし、ptraceでメモリを読み込みます(Linuxでは、シングル命令ステッピングとメモリ読み出しの両方に使用できます)。理論的には、mprotect PROT_NONEとSEGVを捕捉してソフトウェアウォッチポイントを高速化することは可能です。 – osgx
私は 'rtrace'または 'atrace' gdbコマンドを知らない。あなたの "メモリ上のブレークポイントはどのように読み書き"コマンドでしたか? – osgx
申し訳ありませんrwatchとawatchを意味します – Bob5421