Tôi đang cố gắng nắm bắt các tín hiệu như SIGSEGV trong ứng dụng NDK của Android để gỡ lỗi. Đối với điều đó, tôi đã thiết lập một sigaction được gọi là.Android _Unwind_Backtrace bên trong sigaction
Tôi hiện đang cố gắng thu thập cuộc gọi. Vấn đề là _Unwind_Backtrace
chỉ hoạt động trên stack và sigaction hiện tại chạy bên trong ngăn xếp của chính nó.
Vì vậy, có cách nào để có được ngăn xếp của con trỏ thực hiện nhận tín hiệu không? (Về cơ bản nói _Unwind_Backtrace
để thư giãn ngăn xếp khác so với hiện tại?)
Tôi phải chỉ ra rằng:
Sử dụng
backtrace()
vàbacktrace_symbols()
không phải là một lựa chọn từ những chức năng này không được giao trong Android NDKTôi đang sử dụng GDB để điều tra sự cố trên thiết bị cục bộ của mình. Tôi không muốn thay thế GDB, tôi muốn có thể nhận được dấu vết ngăn xếp có ý nghĩa từ khách hàng khi tôi gửi cho anh ta một bản dựng thử nghiệm.
EDIT: Tôi đã cố gắng sử dụng libcorkscrew Android từ hệ thống/lõi theo đề nghị của Fadden nhưng khi tôi sử dụng chức năng của nó unwind_backtrace_signal_arch, tôi nhận được một vết lùi lạ mà không đại diện cho các vụ tai nạn.
Tôi đã tìm kiếm nhưng tôi không thể tìm ra câu trả lời của bạn cách thư giãn một ngăn xếp bằng con trỏ ucontext. Bạn có ahave ví dụ nào không? –
ucontext.h không được cung cấp trong bionic, đó là những gì android sử dụng. Tôi cũng rất quan tâm đến cách kéo thông tin ra khỏi cấu trúc này trên một nền tảng mà cấu trúc không tồn tại. Tôi có nên tin tưởng nó là cùng một thành viên đặt hàng như trong Linux, và chỉ cần rút ra PC và SP theo địa chỉ bộ nhớ? – codetaku
ucontext.h là một phần của bionic, mặc dù nó có thể không có sẵn từ NDK (xem https://android.googlesource.com/platform/bionic/+/kitkat-release/libc/kernel/arch-arm/asm/ucontext.h). Không phải là nó tốt lắm - nó có một định nghĩa khá chung chung. AFAIK không có tùy chỉnh dành riêng cho Android cho ucontext. – fadden