硬體斷點和軟體斷點
在嵌入式開發
,經常用到
jtag
**器。
jtag
**器可以滿足嵌入式程式除錯的基本要求:斷點設定、單步除錯、記憶體編輯、變數、暫存器觀測等。而斷點設定是
jtag
**器最基本的除錯功能。使用者需要系統在設定斷點處停下來後再進行除錯。斷點根據原理和用途不同又分為幾個不同的種類。
斷點可分為硬體斷點和軟體斷點兩大類: 1
.硬體斷點需要目標
cpu的硬體支援,當前流行的
arm7/9
內部硬體設計提供兩組暫存器用來存貯斷點資訊,所以
arm7/9
核心最多支援兩個硬體斷點,而
arm11
則可以支援到
8個硬體斷點。這與偵錯程式無關。
硬體斷點可以設定在任何位置的**上,包括
rom和
ram;而軟體斷點由於需要修改相應位址的值,所以一般只能設在
ram上,但是數量可以不受限制。由於硬體斷點設定的靈活性,所以是最優先選用的斷點資源,但是兩個斷點往往很難滿足工程師進行深入除錯的需要,於是軟體斷點可以作為硬體斷點的補充資源來使用。 2
.軟體斷點則是通過在**中設定特徵值的方式來實現的。當需要在某位址**處設定軟體斷點的時候,**器會先將此處**進行備份保護,然後將預先設定好的斷點特徵值
(一般為
0x0000
等不易與**混淆的值
)寫入此位址,覆蓋原來的**資料。當程式執行到此特徵值所在的位址時,**器識別出此處是乙個軟斷點,便會產生中斷。當取消斷點時,之前受保護的**資訊會被自動恢復。
3. 由於通常的軟體斷點只能設在
ram執行的**上,而隨著系統的**量越來越大,特別是在移動通訊領域,擴充大容量的
ram勢必會增加產品的成本,所以現在很多系統直接在
flashrom
上執行**。對於這種在
flashrom
上執行**的系統,一般的軟體斷點是無法設定的,這也是軟體斷點的侷限性。對於這樣的系統,只能通過交替使用兩個硬體斷點滿足需要,但是會帶來一定的不便。
要很好的解決這一矛盾,只有使**器增加在
flashrom
上設定軟體斷點的功能,拓展**器中可供利用的斷點資源。例如,日本橫河計算機株式會社
(ydc)
最新推出的高階
arm**器—
advicepro
,就是第乙個支援
flash
斷點的ice
**器產品。 在
flashrom
上設定軟體斷點的原理與在
ram上設定軟斷點類似,也是在設定的斷點處用特徵碼替換原有**,通過識別特徵碼使斷點事件發生。不同的是,在
flashrom
上設定軟體斷點需要對
flash
進行擦寫操作,這就需要**器能夠有
flash
程式設計功能,並且能夠在盡可能短的時間內完成特徵碼的寫入。完成這一系列的讀寫操作,就可使在
flashrom
上除錯**的工程師獲得更充裕的斷點資源,從而大大提高了開發效率。
除了
jtag**器
, gdb是除錯的另一有力**。
訊號是實現
gdb斷點功能的基礎。以
x86為例,向某個位址打入斷點,實際上就是往該位址寫入斷點指令
int 3
,即0xcc
。目標程式執行到這條指令之後就會觸發
sigtrap
訊號,gdb
捕獲到這個訊號,根據目標程式當前停止位置查詢
gdb維護的斷點鍊錶,若發現在該位址確實存在斷點,則可判定為斷點命中。
gdb的指令級單步
所謂指令級單步就是指
gdb控制目標程式只執行一條指令之後即停止。指令級單步是
next/step (c
語言原始碼級)、
nexti/stepi(
指令級)
等執行類除錯命令的基礎。指令級單步有硬體單步和軟體單步之分。所謂硬體單步是指
cpu架構本身就支援指令級單步,目標程式可以在執行一條指令之後自動停止。所謂軟體單步是指
cpu架構不支援指令級單步,需要
gdb用軟體方法來實現指令級單步。
(arm
架構的kprobe
也採用類似的方法)
支援硬體單步的架構如
x86和
ppc。對於
x86,可通過設定
eflags
暫存器中的
tf標誌來將
cpu置於單步模式。對於
ppc,則可通過設定
msr暫存器中的
se標誌來將
cpu置於單步模式。在單步模式中,
cpu每執行一條指令,就會產生乙個單步異常,通知
gdb進行處理。
不支援硬體單步的架構如
arm和
mips
。對於此類架構,
gdb採用的是用臨時的軟體斷點來模擬單步的方法。即在需執行指令的下一條指令處臨時插入乙個斷點,然後讓目標程式繼續執行,它會在執行完當前指令之後遇到下一條指令處的臨時斷點,於是目標程式停止,通知
gdb命中斷點,
gdb再將此斷點刪除,由此來完成指令級單步的過程。(插入臨時斷點需要
gdb實現**分支**的功能)
step
和next
的區別:
對於簡單語句,
step
完全等同於
next
。唯一不同的是,若單步過程中遇到函式呼叫,
step
命令將停止在子函式的起始處,而不是將其跨越(無除錯資訊的子函式除外)。
參考http://www.eet-china.com/art_8800448644_480401_ta_b5f39204.htm
硬體斷點和軟體斷點 整理
既然軟體斷點是要往某個位址寫入斷點指令的,那麼最起碼該位址應該是可寫的吧?大多數時候,我們的程式是會被載入到記憶體 ram 中執行的,ram是可讀可寫,這時候軟體斷電就是有效的 2 但是,對於某些比較重要的程式,可能會直接在flash中執行,並且flash對使用者可能是唯讀的,這時候軟體斷點就沒有用...
記憶體斷點和硬體斷點
32位邏輯位址 16位段選擇器 偏移位址 16位段選擇器 13位全域性描述符表 區域性描述符表索引 1位gdt ldtflag 2位的訪問控制許可權 由16位得到段選擇器索引到全域性描述符表得到64位的段描述符,段描述符中包含了線性段基址 線性段基址 偏移位址 邏輯位址後半段 得到線性位址空間的乙個...
OD硬體斷點,OD記憶體斷點,API斷點
一.設定硬體寫入斷點 9 i0 b m a8 8 w8 u f q q r w0 s,k9 h s.2 l w1 d8 r8 j a 0 v4 o r q at r p a l y h 在指定位址進行反 彙編 g m d q e d b,a l x x 7 l h.r d t8 k1 4 follo...