VC中的Just-in-time調試,使用該偵錯模式應用程式可以再Visual C++開發環境之外運行知道發生一個錯誤.當遇到一個程式錯誤時,Just-in-time調試自動載入Visual C++ Debugger .要開啟Just-in-time調試只需要修改Tools->Options->Just-in-time debugging選項即可(其實該選項所做的操作就是寫了個註冊表,將自己作為其他程式拋出異常時的處理常式,下面有介紹)
設定即時調試斷點,在編譯產生的Debug版本程式中加入斷點異常,在代碼中寫入程式碼一個斷點(相當於讓程式出錯),讓程式在到達程式員希望停止位置時載入已經開啟源碼的Debugger實現對該位置的調試. (當然沒有源碼也可以調試的,:-).如果想調試彙編的話.)
VC中的即時調試斷點設定方法:DbgBreakPoint 或者 DebugBreak
C#中的即時調試斷點設定方法:Debugger.Break
JS中的即時調試斷點設定方法:Debugger
ASP(VBS)中的即時調試斷點設定方法:Stop
Visual Studio調試 斷點中斷程式的執行(斷點指令)
斷點指令
那麼我們就來說說什麼是斷點,斷點是什嗎?不是F9 ,也不是那個小紅球,在Intel系列的CPU(包括AMD生產的CPU)裡面,它其實是一個特殊的指令—INT 3。CPU在執行程式的指令集的時候,只要碰到這個指令,就會中斷程式的執行。
引用的樣本
當然我們需要用事實來證明我上面的話,因此把下面的程式編譯並且執行一下,點“Yes”,點“Break”,程式就中斷了.
以下為引用內容:
#include <stdio.h>
void main()
{
printf("Before breakpoint"n");
__asm
{
int 3
}
printf("Before breakpoint"n");
}
斷點是int 3這個指令觸發的。
由int 3這個指令(當然是在intel系列的CPU上面)引申出來的函數 :
語言/工具 |
名稱 |
描述 |
C++ |
DebugBreak |
在C++代碼中寫入程式碼一個斷點。 |
C# |
Debugger.Break |
在.NET代碼中寫入程式碼一個斷點 |
Visual Studio |
斷點 |
設定一個斷點 |
摘抄:
隨時將偵錯工具串連到任何進程的能力稱為即時調試(Just-in-timeDebugging)。
這裡我們對它如何工作稍加說明:當程式員點擊Cancel按鈕,就是告訴UnhandledExceptionFilter函數對進程進行調試。在內部,UnhandledExceptionFilter調用偵錯工具,這需要查看下面的註冊表子關鍵字:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
在這個子關鍵字裡,有一個名為Debugger的數值,在安裝VisualStudio時被設定成下面的值:
"C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\msdev.exe" -p %ld -e %ld
Windows98在Windows98中,這些值不是存放在註冊表中,而是存放在Win.ini檔案中。
這 一行代碼是告訴系統要將哪一個程式(這裡是MSDev.exe)作為偵錯工具運行。當然也可以選擇其他偵錯工具。 UnhandledExceptionFilter還在這個命令列中向偵錯工具傳遞兩個參數。第一個參數是被調試進程的ID。第二個參數規定一個可繼承的 手工複位事件,這個事件是由UnhandledExceptionFilter按無訊號狀態建立的。廠商必須實現他們的偵錯工具,這樣才能認識指定進程 ID和事件控制代碼的-p和-e選項。
在進程ID和事件控制代碼都合并到這個串中之後,UnhandledExceptionFilter通過調用 CreateProcess來執行偵錯工具。這時,偵錯工具進程開始運行並檢查它的命令列參數。如果存在-p選項,偵錯工具取得進程ID,並通過調用 DebugActiveProcess將自身掛接在該進程上。
BOOL DebugActiveProcess(DWORD dwProcessID);
一旦偵錯工具完成自身的掛接,作業系統將被調試者(debuggee)的狀態通報給偵錯工具。
在 偵錯工具完全初始化之後,它要再檢查它的命令列,找-e選項。如果該選項存在,偵錯工具取得相應的事件控制代碼並調用SetEvent。偵錯工具可以直接使用 事件的控制代碼值,因為事件控制代碼具有建立的可繼承性,並且被調試進程對UnhandledExceptionFilter函數的調用也使偵錯工具進程成為一個 子進程。
設定這個事件將喚醒被調試進程的線程。被喚醒的線程將有關未處理異常的資訊傳遞給偵錯工具。偵錯工具接收這些通知並載入相應的原始碼檔案,再將自身放在引發異常的指令位置上。
還 有,不必在調試進程之前等待異常的出現。可以隨時將一個偵錯工具串連在任何進程上,只需運行“MSDEV-pPID”,其中PID是要調試的進程的ID。 實際上,利用Windows2000 TaskManager,做這些事很容易。當觀察Process標記欄時,可以選擇一個進程,點擊滑鼠右鍵,並選擇Debug菜單選項。這將引起 TaskManager去查看前面討論過的註冊表子關鍵字,調用CreateProcess,並傳遞所選定的進程的ID作為參數。在這 裡,TaskManager為事件控制代碼傳送0值。