Làm thế nào để làm tương đương với một phần mềm x86 ngắt:Làm cách nào để đặt điểm ngắt phần mềm trên bộ xử lý ARM?
asm("int $3")
trên một bộ xử lý ARM (cụ thể là một Cortex A8) để tạo ra một sự kiện mà sẽ phá vỡ thực hiện dưới gdb?
Làm thế nào để làm tương đương với một phần mềm x86 ngắt:Làm cách nào để đặt điểm ngắt phần mềm trên bộ xử lý ARM?
asm("int $3")
trên một bộ xử lý ARM (cụ thể là một Cortex A8) để tạo ra một sự kiện mà sẽ phá vỡ thực hiện dưới gdb?
ARM không xác định hướng dẫn điểm ngắt cụ thể. Nó có thể khác nhau trong các hệ điều hành khác nhau. Trên ARM Linux, nó thường là một opcode UND (ví dụ: FE DE FF E7
) trong chế độ ARM và BKPT (BE BE
) trong Thumb.
Với trình biên dịch GCC, bạn thường có thể sử dụng __builtin_trap()
nội tại để tạo điểm ngắt dành riêng cho nền tảng. Một tùy chọn khác là raise(SIGTRAP)
.
Sử dụng trình biên dịch chéo cánh tay-none-EABI-gdb.exe, điều này hoạt động tuyệt vời đối với tôi (nhờ câu trả lời của Igor):
__asm__("BKPT");
Đối với Windows trên ARM, các instrinsic __debugbreak()
vẫn hoạt động trong đó sử dụng opcode không xác định .
nt!DbgBreakPointWithStatus:
defe __debugbreak
Tôi có một thư viện đơn giản (scottt/debugbreak) chỉ cho việc này:
#include <debugbreak.h>
...
debug_break();
Chỉ cần sao chép các debugbreak.h
tiêu đề duy nhất vào mã của bạn và nó sẽ xử lý một cách chính xác ARM, AArch64, i386, x86-64 và thậm chí cả MSVC.
__asm__ __volatile__ ("bkpt #0");
Xem BKPT mục nhập người đàn ông.
On armv7hl tôi (i.MX6q với Linux 4.1.15) hệ thống, để thiết lập một breakpoint trong quá trình khác, tôi sử dụng:
ptrace (PTRACE_POKETEXT, pid, địa chỉ, 0xe7f001f0)
tôi chọn giá trị đó sau strace'ing gdb :)
Điều này hoạt động hoàn hảo: Tôi có thể kiểm tra quá trình truy tìm, khôi phục hướng dẫn ban đầu và khởi động lại quá trình bằng PTRACE_CONT.
Sử dụng lệnh BKPT tạo SIGBUS có vẻ như làm hỏng bộ đếm chương trình. – engie
sử dụng lệnh swi, tôi tin rằng svc là một tên khác cho hướng dẫn đó tùy thuộc vào hương vị của cánh tay. –
Lệnh SWI phụ thuộc vào OS/trình gỡ lỗi. Trình gỡ lỗi Thiên thần định nghĩa mã 0x18 là ReportException và mã con 0x20020 làm điểm ngắt. Nó không di động. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0058d/BACBEFAA.html –