簡體   English   中英

硬件斷點WINAPI

[英]Hardwarebreakpoint WINAPI

我目前正在為一個小調試框架實現最后一個任務,即硬件斷點。 到目前為止,我參考了這篇文章: http : //www.codeproject.com/KB/debug/hardwarebreakpoint.aspx和一本關於編寫調試器的書。

到目前為止,我獲得了以下兩個用於設置硬件斷點的函數:

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)。 之后,我使用調用函數(EIP)的返回地址作為中斷 DR0 並在 DR7 中設置所屬標志的地址。

最后,我將恢復主線程並關閉輔助線程的句柄,因為它已完成。

使用此代碼,我遇到了以下問題:

如果我在調試模式下執行程序,程序會在正確的地址處停止,但我不能再做任何事情,因為我猜設置了 INT1 標志並且 VS 調試器不能進一步單步執行?

如果我在沒有調試的情況下執行程序,它會簡單地崩潰。 我嘗試在提到的項目 (http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx) 中使用 __try, __except 但這也不起作用。

我很感激並提供幫助或信息我做錯了什么以及如何解決這個問題。

我認為嘗試讓程序自行調試不是一個好主意。 為什么不使用 Windows 內置的調試器開發 API?

開發中心 - 桌面 > 學習 > 參考 > 診斷 > 調試和錯誤處理 > 基本調試 > 調試參考 > 調試功能: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms679303%28v=vs .85%29.aspx

在 x86 硬件上,通過在 eflags 中設置陷阱標志來啟用單步執行。 CPU 在完成一條指令后將引發調試異常(中斷 1)。 我認為正在發生的是 Visual Studio 調試器正在改變標志的那一點,干擾你正在嘗試做的事情。

嘗試在 Visual Studio 之外運行您的程序(無調試器)。 那么它是否按預期工作?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM