簡體   English   中英

斷點如何在C ++代碼中工作?

[英]How do breakpoints work in C++ code?

斷點如何在C ++代碼中工作? 在編譯代碼時,它們是否在某些匯編指令之間插入了特殊指令? 或者還有其他的東西嗎? 此外,如何實現代碼逐步執行? 和斷點一樣......?

這很大程度上取決於CPU和調試器。

例如,x86 CPU上可能的解決方案之一:

  • 在所需位置插入一字節INT3指令
  • 等到斷點異常命中
  • 將異常地址與斷點列表進行比較以確定哪個斷點
  • 做斷點行動
  • 將INT3替換為原始字節,並將調試過程切換到跟蹤模式(逐步執行CPU指令)
  • 繼續調試過程
  • 您立即捕獲跟蹤異常 - 指令已執行
  • 把INT3放回去

觀察點可以以類似的方式實現,但是您可以將內存頁面置於只讀狀態或不進入訪問模式,而不是INT3,而是等待分段異常。

也可以使用跟蹤模式來逐步執行組裝。 也可以通過基於調試數據將斷點放在下一條指令上來逐步執行源代碼行。

當你只是將地址加載到某個寄存器時,一些CPU也有硬件斷點支持。

根據technochakra.com上的這篇博客文章 ,你是對的:

軟件斷點通過在正在調試的程序中插入特殊指令來工作。 英特爾平台上的這條特殊指令是“int 3”。 執行時,它調用調試器的異常處理程序。

我不確定如何實現下一條指令的執行。 但是,文章繼續補充:

出於實際原因,每當添加或刪除斷點時都要求重新編譯是不明智的。 調試器更改內存中可執行文件的加載圖像,並在運行時插入“int 3”指令。

但是,這只會用於“運行到當前行選項”。

單步執行是在(匯編程序)代碼級而不是在C ++級實現的。 調試器知道如何將C ++代碼行映射到代碼地址。

有不同的實現。 有些CPU支持使用斷點寄存器進行調試。 當執行到達斷點寄存器中的地址時,CPU執行斷點異常。

另一種方法是使用特殊指令對執行時的代碼進行修補,最好是一個單字節指令。 在通常為int 3的x86系統中。

第一種方法允許ROM中的斷點,第二種方法允許同時有更多的斷點。

AFAIK所有調試器(對於任何編譯語言)允許無限數量的斷點使用替換指令的變體,使用特殊值(如上所述)進行斷點,並保留已放置這些值的位置列表。

當處理器嘗試執行這些特殊值之一時,會引發異常,調試器捕獲它並檢查異常的地址是否在其斷點列表中。 如果是,則調用調試器並為用戶提供交互機會。 如果它不是,那么異常是由於程序從一開始就存在的,並且調試器允許異常“傳遞”到可能存在的任何錯誤處理程序。

另請注意,調試自修改代碼可能會失敗,因為調試器會暫時修改代碼本身。 (當然,沒有人會寫自我修改,現在他們會嗎?> ;-)

出於這些原因,重要的是調試器有機會在終止調試會話之前刪除它設置的所有斷點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM