Windows提供了許多偵錯工具的方法.其中一個叫Basic Debug.提供了基礎調試方法.
他是一個事件驅動的調試方法.提供了簡單調試功能.所謂事件驅動就是在相關調試事件發生時給調試器發送相關事件並由調試器對該事件採取適當的動作.
下面就來看看如何建立一個基礎調試器.
有兩種方式運行基礎調試器.
1.其中一個方法是調試正在運行進程.
要對運行中的進程進行調試,可以通過調用DebugActiveProcess,並指定進程標識(PID).
要得到進程ID可以調用 EnumProcesses or
Process32First 兩個函數.
DebugActiveProcess 將調試器附加到目標進程. 這樣就只能調試所附加的進程而不能調試子進程.
調試器必須有適當許可權來執行 DebugActiveProcess. 要得到更多許可權控制可參閱 許可權控制( Access Control ).
在調試器建立或附加到所要調試的目標進程後,系統將目標進程(如果指定子進程也包括在內)發生的所有相關事件發送到調試器. 要瞭解更多的調試事件可參考 Debugging
Events.
要分離調試進程,調試器調用 DebugActiveProcessStop 函數.
調試函式宣告
BOOL WINAPI DebugActiveProcess( __in DWORD dwProcessId);
dwProcessID 指定進程 PID
如果執行成功返回非0,否則錯誤返回0,要擷取更多錯誤資訊,執行GetLastError.要停止調試,你只要退出被調試的進程,或者調用 DebugActiveProcessStop 函數.
退出調試器同樣退出被調試進程,除非你調用了 DebugSetProcessKillOnExit 函數.
調試器必須對目標進程有相應許可權, 並且能對開啟的進程具有 PROCESS_ALL_ACCESS許可權.
Windows Me/98/95上, 如果目標進程PID有效,調試器 就有適當許可權.
其他版本Windows, 如果目標進程使用了安全性描述元,調試器如果沒有Full Access,
調用DebugActiveProcess 將失敗.如果調試進程具有 SE_DEBUG_NAME 許可權並啟用,它就能調試任何進程。
系統檢測完進程PID,並確認調試器有效後。函數DebugActiveProcess返回 TRUE.
然後調試器調用 WaitForDebugEvent 函數來等待事件。
這裡要注意, DebugActiveProcess WaitForDebugEvent DebugActiveProcessStop 這三個函數要在同一個線程運行
系統暫停被調試進程中的所有線程, 並給調試進程發送被調試進程的目前狀態。
系統發送一個 CREATE_PROCESS_DEBUG_EVENT 調試事件表明指定進程. CREATE_PROCESS_DEBUG_INFO 的lpStartAddress
成員為NULL
進程中的每個線程,系統發送一個CREATE_THREAD_DEBUG_EVENT事件。 CREATE_THREAD_DEBUG_INFO 的lpStartAddress
成員為NULL
目標進程地址空間載入的每一個動態庫(DLL),系統將發送一個 LOAD_DLL_DEBUG_EVENT 調試事件。
系統將安排給第一個線程一個斷點,當恢複運行時將停在那。
當所有這些都完成後,系統復原運行所有的線程。並執行斷點引發一個 EXCEPTION_DEBUG_EVENT 調試事件。
然後其它調試事件將陸續發送到調試器。
函數要求指引
系統要求 |
Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95. |
伺服器版本 |
Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server. |
標頭檔 |
Declared in Winbase.h; include Windows.h. |
連結庫 |
Use Kernel32.lib. |
動態庫 |
Requires Kernel32.dll. |
2.另外一個方法是使用CreateProcess函數建立要調試的進程,並給建立標記(CreateFlag)設定為DEBUG_PROCESS
如果不想接受被調試進程子進程調試訊息可委任標記DEBUG_ONLY_THIS_PROCESS,即設定建立標記為DEBUG_ONLY_THIS_PROCESS | DEBUG_PROCESS
建立後直接可通過WaitForDebugEvent接收調試事件。