2015-11-23 75 views
-1

我想檢測硬件斷點。我能夠讀取使用的寄存器值:在linux上讀取調試寄存器

unsigned sp; 
__asm __volatile("movl %%esp, %0" : "=r" (sp)); 
return sp; 

嘗試將64機器我得到Error: unsupported instruction 'mov'上閱讀dr0。 我設法用-m32進行編譯,但是當我嘗試運行時遇到了分段錯誤。

如何檢查調試寄存器?我對32位和64位解決方案都感興趣。

+0

這是爲什麼downvoted?請解釋。 – robert

+0

你被低估了,因爲你沒有向我們展示錯誤的代碼。如果你不告訴我們你做了什麼,我們如何告訴你你做錯了什麼? – fuz

+0

@FUZxxl,錯誤的代碼在上面,只需用dr0替換esp即可。 – robert

回答

1

你需要在64位模式爲使用64位寄存器,這就是爲什麼它不編譯(大概,因爲你還沒有顯示出您是否嘗試過實際的代碼...)

在任何情況下,你不能在用戶模式下讀取調試寄存器。你應該說爲什麼你需要訪問他們,否則這是一個XY問題。我最好的猜測是你可能對ptrace API感興趣。

+0

已編輯,我想檢測是否有硬件斷點設置。還有一切,我將'esp'改爲'dr0',並嘗試打印該值。 – robert

+0

@ franz1我不認爲你可以在Linux上這樣做。訪問調試寄存器是一項特權操作,操作系統不允許你這樣做。相反,使用'ptrace()'API來確定是否正在調試。 – fuz

+0

還要注意,如果其他人已經連接,調用'ptrace'將失敗,這已經是一個指示。如果調試器足夠聰明以隱藏自己,那麼調試寄存器也會這樣做。 – Jester