Visual C Dev C 或者 Code Blocks 等等中的 Debug 功能是怎麼實現的?

時間 2021-06-02 12:21:09

1樓:Anbang24

我對Dev-C++和Code::Blocks 這兩個整合開發環境(簡稱為 IDE)比較熟悉,可以講一下。(VC++應該也是類似的)

Dev-C++ 和 Code::Blocks 是整合了GCC編譯器和GDB偵錯程式。你可以在它們的安裝目錄下找到相應的GCC編譯器和GDB偵錯程式的安裝檔案和資料夾。

在 IDE 中啟動編譯時,通常是在後台開啟乙個程序,在該程序中呼叫編譯器執行一條編譯命令(簡單的例子是「gcc -o a.exe a.cpp」。

當然實際上會複雜一些),並截獲這條命令執行後的輸出資訊,然後整理格式,輸出到編譯資訊視窗中。

在 IDE 中啟動除錯時,通常也是在後台開啟乙個程序,在該程序中呼叫偵錯程式執行一條除錯命令(也就是說,讓偵錯程式在後台執行),並不斷地截獲偵錯程式執行過程中的輸出資訊,然後分析這些輸出資訊,並在編輯器和除錯資訊視窗中執行相應的操作

例如,輸出資訊顯示執行到哪一行了,就在編輯器中跳轉到那一行並以相應的顏色顯示該行。如果需要監視某個變數的值,那麼偵錯程式的輸出資訊就會相應地顯示這個變數的值,分析這條輸出資訊之後就把變數的值顯示到監視視窗。

當使用者執行「下一行」和「單步進入」操作時,實際上是向那個程序傳送一條簡潔的命令,要求偵錯程式進行相應的操作,然後同樣地截獲偵錯程式執行該命令後的輸出資訊。

當使用者執行「結束除錯」命令時,就是向該程序傳送命令,要求偵錯程式結束執行。

(如果你想知道具體是哪些命令,可以在網上查一下如何使用 GDB偵錯程式)

2樓:

Linux 有個機制可以搜一下,叫 ptrace,一般 GDB 在 Linux 下是靠這個東西實現的。

Jserv's blog: 以 ptrace 系統呼叫來追蹤/修改行程

這篇文章有所解釋,而且有簡單的例子。

3樓:Belleve

斷點是 int 3,Watch 是靠編譯器提供的資訊從 stack、heap 裡讀,實時顯示變數名之類的也差不多。Call stack 也類似。

4樓:施懿民

主要是CPU和作業系統配合,可以用一些特定的指令或暫存器來告訴CPU中斷被除錯的程式執行,然後由作業系統找到系統內註冊的偵錯程式除錯程序。在除錯過程中,因為需要將二進位制的指令和記憶體位址翻譯成原始碼位置和變數,需要符號檔案,這個符號檔案是由編譯器生成的。

5樓:

可以參考張銀奎著寫的《軟體除錯》一書,全書共六篇,分別講解了CPU、作業系統和編譯器對除錯的支援,然後是被除錯軟體的可除錯性,最後介紹了WinDbg的實現和用法。

Win平台上幾乎所有的除錯相關的技術都可以在這本書裡找到。

6樓:opencore

編譯器負責生成除錯資訊,裡面包含符號表,範圍資訊,行號,棧幀資訊等。I DE一般會內嵌偵錯程式,偵錯程式負責讀取和分析除錯資訊,根據使用者的命令進行相應操作。

除錯資訊有各種不同的標準,乙個比較流行的是dwarf, 目前最新的是dwarf 4。

如何評論NHSMUN MPC AD 模聯人Cormac?

real xynnnnn 1.嘉賓論壇的時候和cormac坐一桌,感覺他真的是學識淵博,英語講得也很好,是很厲害的乙個人。完了以後這樣乙個大佬並不會讓人覺得很難接近,和我們玩得挺嗨的哈哈哈。而且他還十分擅長懟人 對沒錯 2.講真我感覺他很成熟,以至於我知道他的年齡時被下了一跳,因為我一開始覺得他怎麼...

flask 中怎樣使用session和cookie使使用者保持登入一段時間?

芒果 Response set cookie key 鍵 value 值 max age None 秒為單位的cookie壽命,None表示http only expires None 失效時間,datetime物件或unix時間戳 path cookie的有效路徑 domain None cook...

協變張量(covariant)與逆變張量(contravariant)的物理意義?

小咖啡 樓主這樣理解 乙個座標系,其兩點間隔的度量性質,其實就是兩個因素決定 乙個是座標系本身的形式,比如你是直角座標系,還是極座標系 還有乙個就是度規 度規決定的是計算的方法,座標系本身形式決定的是算間隔長度時,積分上下限取什麼樣的值,比如說描述球面上,我可以用經緯度座標,也可以用其他性質的座標,...