私は現在、少しのデバッグフレームワーク、すなわちHWブレークポイントのための最後のタスクを実装しています。 これまでのところ、http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspxと、デバッガの作成に関する書籍を参照しました。Hardwarebreakpoint WINAPI
私はHWブレークポイントを設定するために、これまで二つの機能を以下ました:
void debuglib::breakpoints::hw_bp() {
HANDLE helper = 0;
CONTEXT co;
CURRENTCONTEXT(co);
helper = ::CreateThread(0,0,threadfunc,reinterpret_cast<void*>(co.Eip),0,0);
DWORD status = ::WaitForSingleObject(helper,INFINITE);
if (status != WAIT_OBJECT_0) {
::MessageBoxA(0, "Helper thread didn't exit cleanly", "HWBreakpoint", MB_OK);
}
::CloseHandle(helper);
}
static DWORD WINAPI debuglib::breakpoints::threadfunc(void* param) {
DWORD suspendcnt = ::SuspendThread(debuglib::process::thread());
if(suspendcnt) {
return 0;
}
CONTEXT co;
::ZeroMemory(&co,sizeof(co));
co.ContextFlags = CONTEXT_DEBUG_REGISTERS;
BOOL ok = ::GetThreadContext(debuglib::process::thread(),&co);
if(!ok) {
return 0;
}
DWORD freeDr = 0;
DWORD condition = debuglib::breakpoints::TRIGGER::CODE;
DWORD length = debuglib::breakpoints::SIZE::SIZE_1;
co.Dr0 = reinterpret_cast<DWORD>(param);
co.Dr7 = co.Dr7 | 1 << (freeDr*2);
co.Dr7 = co.Dr7 | condition << ((freeDr*4)+16);
co.Dr7 = co.Dr7 | length << ((freeDr*4)+18);
co.ContextFlags = CONTEXT_DEBUG_REGISTERS;
ok = ::SetThreadContext(debuglib::process::thread(), &co);
co.ContextFlags = CONTEXT_DEBUG_REGISTERS;
::GetThreadContext(debuglib::process::thread(),&co);
suspendcnt = ::ResumeThread(debuglib::process::thread());
if(suspendcnt == 0xFFFFFFFF) {
return 0;
}
return 1;
}
だから最初に私は - 私は、現在のスレッドをデバッグするため、ヘルパースレッドを作成しています。ヘルパースレッドのコールバック関数内で、私はメインスレッドを一時停止しています。その後、メインスレッドの現在のDR値を読み込みます(これは関連しない瞬間ですが、DR0を常に使用していますので、どのレジスタが空いているかチェックし、最大4つのBPを使用します)。その後、DR0を中断してDR7の所属フラグを設定するために、呼び出し元関数(EIP)の戻りアドレスをアドレスとして使用しました。
最後に、メインスレッドを再開し、ヘルパースレッドのハンドルを終了します。終了しました。私は問題以下しまったこのコードの
:INT1フラグは、私が推測する設定とVSしているので、私はデバッグモードでプログラムを、プログラムを実行した場合
は右のアドレスで停止しますが、私はもう何もできませんデバッガは一歩前進できませんか?
デバッグせずにプログラムを実行すると、単純なクラッシュが発生します。 上記のプロジェクト(http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx)のように__try、__exceptを使用しようとしましたが、これはうまくいきません。
私は間違っていることと、この問題を解決する方法を理解し、情報を提供してくれています。
使用している本の名前は何ですか?私はhwデバッガの開発にも興味があります。 –
これは「Hacking with Python」と呼ばれていますが、ドイツ語で書かれています(http://www.amazon.de/Hacking-mit-Python-Fehlersuche-Programmanalyse/dp/3898646335/ref=sr_1_1?ie=UTF8&qid= 1325766641&sr = 8-1)。 – Chris
ありがとう、私は同じ著者から英語で何かを見つけようとします。説明のために –