2015-04-12 135 views
0

gdb斷點或服務器(我假設客戶端存根和服務器以幾乎相同的方式處理它們)如何處理SW概念上的斷點? 我對運行gdb存根/服務器的'bare metal'目標感興趣,並且斷點和單步執行都使用軟件中斷。gdb-stub/server如何處理SW斷點?

我實際的問題:

當一個斷點時,是如何保存的指令運行,這樣,斷點可以「重新安裝」和(保存)機器狀態(包括寄存器的內容)不會改變從擊中斷點的那一刻開始? =>何時重新安裝斷點以及如何?在斷點擊中和進入命令解釋器之間,還是在下一步或coninue?

又如何單步跳過斷點工作,使原始的非斷點指令得到執行,並且斷點在單步後仍然保持在那裏?

忘記:文檔「GDB內部」似乎缺少該信息 - 實際上整個子章節中關於單步執行「算法」一章。

[EDIT2] 啊,我似乎需要更強有力的眼鏡:在「Internals'-手冊說: 「當用戶說繼續,GDB會恢復原來的指令,單步,重新插入陷阱,並繼續。「

但是,單步跳過斷點仍然是個懸而未決的問題。

回答

1

但是,單步跳過斷點仍然是個懸而未決的問題。

它和continue完全一樣,除了最後一步(「和繼續」)。即:

  1. 進程停止。 GDB「環顧四周」,發現$ip指向其中一個斷點。
  2. 用戶問題continuenext,stepstepi命令。
  3. 恢復原始指令(即刪除斷點)
  4. 單步過程
  5. 重新插入斷點
  6. 繼續(這是爲完成continue但不能用於nextstepstepi)。
  7. 對於stepi,將控制返回給用戶(由於上述步驟4我們已經在下一條指令)。對於next,請繼續單步操作,直到我們到達與上述第1步中所在行不同的行中的某一行。
+0

如果確實如此,則單步替換/恢復指令將會陷入陷阱(早先通過設置斷點)。這將導致單步內的斷點。 – turboscrew

+0

@turboscrew你錯了,它*做*這樣做。 Souce:我是GDB開發人員。單步處理(步驟4)意味着在'EFLAGS'中設置'TF'標誌並繼續。處理器將自動執行一個(原始的,在步驟3中恢復的)指令,然後停止。 –

+0

「SW斷點如何處理」 - 沒有陷阱標誌(順便說一下,我沒有使用x86或x86_64系列)。 AAARGH,我明白了:你的意思是通過'恢復原始指令'去除斷點。 – turboscrew