2012-01-05 13 views
12

私は現在、少しのデバッグフレームワーク、すなわち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を使用しようとしましたが、これはうまくいきません。

私は間違っていることと、この問題を解決する方法を理解し、情報を提供してくれています。

+0

使用している本の名前は何ですか?私はhwデバッガの開発にも興味があります。 –

+2

これは「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

+0

ありがとう、私は同じ著者から英語で何かを見つけようとします。説明のために –

答えて

1

プログラムのデバッグ自体を試みることはお勧めできません。なぜWindowsに組み込まれているデバッガ開発APIを使用しないのですか?

デベロッパーセンター - デスクトップ>学び>リファレンス>診断>デバッグおよびエラー処理>基本的なデバッグ>デバッグリファレンス>デバッグ機能: x86ハードウェア上でhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms679303%28v=vs.85%29.aspx

、シングルステップはでトラップフラグを設定することで有効になっていますeflags。 CPUは、1つの命令を完了した後にブレークポイント例外を発生させます。私が考えていることは、ビジュアルスタジオのデバッガが、フラグのビットを変更して、あなたがやろうとしていることを妨げていることです。

ビジュアルスタジオ(デバッガなし)の外でプログラムを実行してみてください。期待どおりに動作しますか?