Cập nhật:
Dường như một patch được tạo ra để hỗ trợ backtrace()
trên uclibc cho x86 và ARM (XScale) và nó làm cho việc sử dụng biểu tượng __libc_stack_end
.
gốc trả lời:
tôi đã làm việc trên một dự án mà phiên bản của glibc chúng tôi đang sử dụng không cung cấp một chức năng backtrace()
cho bộ vi xử lý ARM của chúng tôi, vì vậy chúng tôi phát triển bên ngoài của chúng ta của glibc sử dụng Biểu tượng __libc_stack_end
. Dưới đây là mã kết quả. Có lẽ bạn có thể sử dụng nó để viết một hàm uclibc backtrace()
.
extern void * __libc_stack_end;
struct backtrace_frame_t
{
void * fp;
void * sp;
void * lr;
void * pc;
};
int backtrace(void ** array, int size)
{
void * top_frame_p;
void * current_frame_p;
struct backtrace_frame_t * frame_p;
int frame_count;
top_frame_p = __builtin_frame_address(0);
current_frame_p = top_frame_p;
frame_p = (struct backtrace_frame_t*)((void**)(current_frame_p)-3);
frame_count = 0;
if (__builtin_return_address(0) != frame_p->lr)
{
fprintf(stderr, "backtrace error: __builtin_return_address(0) != frame_p->lr\n");
return frame_count;
}
if (current_frame_p != NULL
&& current_frame_p > (void*)&frame_count
&& current_frame_p < __libc_stack_end)
{
while (frame_count < size
&& current_frame_p != NULL
&& current_frame_p > (void*)&frame_count
&& current_frame_p < __libc_stack_end)
{
frame_p = (struct backtrace_frame_t*)((void**)(current_frame_p)-3);
array[frame_count] = frame_p->lr;
frame_count++;
current_frame_p = frame_p->fp;
}
}
return frame_count;
}
Lưu ý: Biểu tượng __libc_stack_end
không còn được xuất khẩu trong nhiều phiên bản gần đây của glibc và tôi không chắc chắn về sự tồn tại của nó hoặc một biểu tượng tương tự trong uclibc.
từ đoạn mã trên tôi đang nhận được lỗi runtime "lỗi vết lùi : __builtin_return_address (0)! = frame_p-> lr ". cách giải quyết tình trạng này. – Mandar
Quy ước gọi điện chuẩn của ARM ([liên kết pdf] (http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf)) phân bổ r14 làm thanh ghi liên kết. Lệnh BL, được sử dụng trong một cuộc gọi chương trình con, lưu trữ địa chỉ trả về trong thanh ghi này. Các hàm '__builtin_frame_address (0)' và '__builtin_return_address (0)' được sử dụng cho [nhận được trả về và địa chỉ khung của hàm gọi] (http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html). Lỗi của bạn nói rằng thanh ghi liên kết không chứa địa chỉ trả về hoặc cấu trúc 'backtrace_frame_t' không khớp với khung ngăn xếp của bạn. – jschmier