2012-07-05 63 views
12

我怎麼做一個x86軟件中斷相當於:在ARM處理器上(具體爲Cortex A8的)如何在ARM處理器上設置軟件斷點?

asm("int $3") 

生成將打破在gdb下執行的事件?

+0

使用BKPT指令會生成一個SIGBUS,這似乎會弄亂程序計數器。 – engie 2012-07-05 13:30:56

+0

使用swi指令,我相信svc是該指令的另一個名稱,具體取決於arm的風格。 – 2012-07-05 13:49:43

+0

SWI指令是OS /調試器相關的。 Angel調試器將代碼0x18定義爲ReportException,將子代碼0x20020定義爲斷點。它不是便攜式的。 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0058d/BACBEFAA.html – 2013-06-26 21:48:07

回答

17

ARM沒有定義特定的斷點指令。它可以在不同的操作系統中有所不同。在ARM Linux上,它通常是ARM模式下的UND操作碼(例如FE DE FF E7)和Thumb中的BKPT(BE BE)。

使用GCC編譯器,通常可以使用__builtin_trap()內部函數來生成平臺特定的斷點。另一種選擇是raise(SIGTRAP)

7

採用ARM-NONE-EABI-gdb.exe交叉編譯器,這對我來說(感謝伊戈爾的答案)的偉大工程:

__asm__("BKPT"); 
1

對於Windows在ARM中,稟__debugbreak()仍然有效,它利用未定義操作碼。

nt!DbgBreakPointWithStatus: 
defe  __debugbreak 
2

我有一個簡單的庫(scottt/debugbreak)只是這樣的:

#include <debugbreak.h> 
... 
debug_break(); 

debugbreak.h頭只需複製到你的代碼,它會正確處理ARM,AArch64,I386,X86-64甚至MSVC。

1

__asm__ __volatile__ ("bkpt #0");

BKPT人進入。

0

在我armv7hl(i.MX6q使用Linux 4.1.15)系統,設置一個斷點在另一個進程中,我使用:

的ptrace(PTRACE_POKETEXT,PID,地址,0xe7f001f0)

我選擇gdb :)後的值:

這很好用:我可以檢查跟蹤的進程,恢復原始指令,然後用PTRACE_CONT重新啓動進程。