2016-08-21 28 views
1

據我所知(我可能是錯的),沒有辦法只在一個x86-64系統上執行一個指令。也許相反,你可以執行指令後跟着'ud2'操作碼來觸發一個信號 - 但是你必須擔心指令修改控制流並去其他地方。然而,如果我理解正確,ptrace()系統調用有一個SINGLESTEP選項,它將只執行一條指令。這是如何實施的?我無法想象內核具有某種反彙編器來識別關於它的指令和原因。那麼,是否有某種使用我不知道的架構特徵?或者完全不同的東西?PTRACE_SINGLESTEP如何實現?

+4

我不是最新的,但是陷阱旗(TF)不再是一個東西? – NPE

+0

不,我只是不知道! – bchurchill

回答

5

是的,有一個建築單步標誌。從內核返回到用戶空間使內核有機會同時設置RIP/RFLAGS,因此它可以爲用戶空間設置單步而不用在內核指令上觸發。

由於某種原因,Trap Flag有它自己的維基百科文章!另見wikipedia's EFLAGS article

請參閱標記wiki,以鏈接到英特爾架構手冊,其中記錄了所有這些內容。


也許不是你可以執行該指令其次是「ud2的」操作碼觸發信號

然後你需要代碼,以確定解碼的x86指令長度。你不會使用ud2,你會使用int3 which exists for this purpose.

IIRC,也有調試寄存器,可以設置硬件斷點而不修改代碼。