發表文章

從頭實作一個 WIN32 Source Level 除錯器

很久以前 寫過一篇關於debugger的文,但只起個頭就沒有繼續了,現在才把這件事再拿起來作。 < GitHub > 1. WIN32 除錯事件及迴圈 1.1 最小的 WIN32 除錯器 Windows 提供 WIN32 API 支援除錯器 (Debugger) 的實作,以下是一個最小的 WIN32 環境底下的除錯器。主要分為兩個部份。一、啟動被除錯的程式 (Debuggee),二、除錯事件迴圈 (Debug Event Loop)。 # include <windows.h> void main () { CreateProcess(..., DEBUG_ONLY_THIS_PROCESS ,...); while (WaitForDebugEvent(...)) { if (EXIT_PROCESS) { break ; } ContinueDebugEvent(...); } } 以上幾行程式碼雖然不能作什麼事,但已經是一個最小的 WIN32 除錯器了。接下來我們會一步一步建立出一個 Source Level Debugger 的各個主要功能。 1.2 啟動被除錯的程式 使用 CreateProcess 啟動被除錯程式,被除錯程式會作為除錯器的子行程。當除錯器關閉時,被除錯程式的行程也會隨之終止。除錯器呼叫的 CreateProcess 必須加上 DEBUG_ONLY_THIS_PROCESS 參數,才能對子行程除錯。加上 CREATE_NEW_CONSOLE 參數開啟新的文字視窗,以避免被除錯程式和除錯器的輸出混雜在一起。若被除錯程式或除錯器是有 GUI 的視窗程式,則此參數是否有加上則無影響。 STARTUPINFO si = { 0 }; si.cb = sizeof (si); if (!CreateProcess(DEBUGEE_FILE_NAME, NULL , NULL , NULL , FALSE, DEBUG_ONLY_THIS_PROCESS | CREATE_NEW_CONSOLE, NULL , NULL , &si, &g_piDbgee)) { printf ( "CreateProcess failed: %u...
最近的文章