程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> Win32調試接口設計與實現淺析

Win32調試接口設計與實現淺析

編輯:vc教程

所謂調試器實際上是一個很寬泛的概念,凡是能夠以某種形式監控其他程序執行過程的程序,都可以泛稱為調試器。在Windows平台上,根據調試器的實現原理大概可以將之分為三類:內核態調試器、用戶態調試器和偽代碼調試器。

內核態調試器直接工作在操作系統內核一級,在硬件與操作系統之間針對系統核心或驅動進行調試,常見的有SoftICE、WinDbg、WDEB386和i386KD等等;用戶態調試器則通過操作系統提供的調試接口,在操作系統和用戶態程序之間針對用戶態程序進行調試,常見的有各種開發環境如VC/Delphi自帶的調試器,OllyDbg等等;偽代碼調試器則使用目標系統自定義的調試接口,調試由用戶態程序支持的腳本語言或虛擬機代碼,常見的如JVM/CLR的調試工具、VB的pcode調試器、Active Script調試器等等。

因為偽代碼調試器跟具體系統實現相關性太強,不具備原理層面的通用性,本系列文章盡量不涉及其內容,以後如果有機會可以再討論一下JVM/CLR/Active Script提供的調試接口;用戶態調試器應用最廣泛,參考資料也較為完整,我會花較大精力和大家探討;核心態調試器則跟操作系統結合較為緊密,加上我也不是太熟悉,只能盡力而為了,呵呵。歡迎大家提出批評指正意見和建議 :)

此外強烈推薦John Robbins在MSDN的Bugslayer專欄,以及其所著的<Debugging Applications>一書(中文版《應用程序調試技術》),此書中對調試器從原理到應用都有很全面的講解。

[1] 用戶態調試器結構初探

用戶態調試器直接使用Win32 API提供的調試接口,遵循Win32的事件驅動的設計思想,其實現思路非常簡單,基本框架偽代碼如下:

以下為引用?lt;/B>
//啟動要調試的進程或掛接調試器到已運行的進程上
CreateProcess(..., DEBUG_PROCESS, ...) or DebugActiveProcess(dwProcessId)
DEBUG_EVENT de;
BOOL bContinue = TRUE;
DWORD dwContinueStatus;
while(bContinue)
{
bContinue = WaitForDebugEvent(&de, INFINITE);
switch(de.dwDebugEventCode)
{
...
default:
{
dwContinueStatus = DBG_CONTINUE;
break;
}
}
ContinueDebugEvent(de.dwProcessId, de.dwThreadId, dwContinueStatus);
}

在調試器開始調試的時候,會啟動被調試程序的新進程或者掛接(attach)到一個已運行進程上,此時Win32系統會啟動調試接口的服務器端;然後調試器調用WaitForDebugEvent函數等待調試服務器端的調試事件被引發;調試器根據調試事件進行相應的處理;最後調用ContinueDebugEvent函數請求調試服務器繼續執行被調試進程,以等待並處理下一個調試事件。

首先我們大致看看調試接口的服務器端的實現思路:調試服務的服務器端接口實際上是存在於被調試進程的調試端口(Debug Port),此核心對象實現上跟Win32的完成端口類似,都是通過一個核心隊列實現的LPC端口。啟動調試服務器實際上就是掛接Win32的調試子系統到被調試進程,並在被調試進程內構造調試端口。調試器通過調試端口與Win32的調試子系統通訊;調試子系統響應系統操作所引發的調試事件,並通過調試端口將調試事件分發給核心態/用戶態調試器。

建立被調試程序的新進程時,需要在CreateProcess函數的dwCreationFlags參數設置DEBUG_ONLY_THIS_PROCESS或DEBUG_PROCESS標志位,以表示新建的進程需要被調試。CreateProcess函數的調用路徑如下

以下為引用:
CreateProcessA/CreateProcessW (kernel32.dll)
CreateProcessInternalW (kernel32.dll)
NtCreateProcessEx (ntoskrnl.dll)
PspCreateProcess (ntos\ps\create.c:969)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved