Vì lý do khắc phục sự cố, tôi muốn có thể truy xuất và in ngăn xếp người gọi của chức năng hiện đang chạy. Tôi đã thử những điều sau đây:Làm cách nào để truy xuất ngăn xếp ngăn xếp của ngăn xếp của hàm hiện đang chạy?
/*******************************************************************************
* *
* * xxxTracePrint - stack trace print function
* *
* * RETURNS: OK or ERROR
* */
static void xxxTracePrint
(
INSTR *caller,
int func,
int nargs,
int *args
)
{
char buf [250];
int ix;
int len = 0;
len += sprintf (&buf [len], "%#10x: %#10x (", (int)caller, func);
for (ix = 0; ix < nargs; ix++) {
if (ix != 0)
len += sprintf (&buf [len], ", ");
len += sprintf (&buf [len], "%#x", args [ix]);
}
len += sprintf (&buf [len], ")\n");
printf (buf);
}
/*******************************************************************************
* *
* * xxxTrace - stack trace
* *
* * RETURNS: OK or ERROR
* */
int xxxTrace(int tcb)
{
REG_SET regs;
if (tcb == 0)
return (ERROR);
taskRegsGet (tcb, ®s);
trcStack (®s, (FUNCPTR) xxxTracePrint, tcb);
return (OK);
}
void DbgTest(void)
{
xxxTrace(taskIdSelf());
}
nhưng tôi nhận được:
JPAX-DP> DbgTest
trcStack aborted: error in top frame
value = 0 = 0x0
Đây có phải là thậm chí có thể? Tôi có thể làm cái này như thế nào? Tôi đã thấy, đối với taskRegsGet(), họ nói:
Thường trình này chỉ hoạt động tốt nếu công việc được xác định là ổn định, trạng thái không thực hiện là . Tự kiểm tra, ví dụ, không được khuyến khích, vì kết quả là không thể đoán trước.
Nhưng tôi nên áp dụng phương pháp nào khác?
Trình biên dịch là diab
và cpu vòm powerpc
Bạn có thể sử dụng backtrace() , nếu nó có sẵn trong vxworks, trang người đàn ông của nó có một ví dụ làm việc quá – Pras
@ Harry bạn có quyền truy cập vào mã surce & WindRiver Workbench? – cerr
@cerr Có Tôi có quyền truy cập vào mã nguồn và bàn làm việc của Windriver – Harry