即時調試(Just-in-timeDebugging) Visual Studio調試 斷點中斷程式的執行(斷點指令)

來源:互聯網
上載者:User

    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值。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.