如何检索当前 运行 函数堆栈的堆栈跟踪?
How can I retrieve a stack trace of the currently running function's stack?
出于故障排除原因,我希望能够检索并打印当前 运行 函数的调用程序堆栈。
我尝试了以下方法:
/*******************************************************************************
* *
* * 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());
}
但我得到:
JPAX-DP> DbgTest
trcStack aborted: error in top frame
value = 0 = 0x0
这可能吗?我怎样才能做到这一点?我看到,对于 taskRegsGet(),他们说:
This routine only works well if the task is known to be in a stable,
non-executing state. Self-examination, for instance, is not advisable,
as results are unpredictable.
但我还应该应用什么其他方法?
编译器是diab
和cpu arch powerpc
如果您的编译器是 GCC 并且您的体系结构的调用约定允许它(x86 是第一个想到的),我建议使用 __builtin_return_address(unsigned int level)。更多信息可以在这里找到:
https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html.
您提到 taskRegsGet() 提到不建议从当前 运行 任务调用。然而,我看到有人使用 taskDelay(1) 并附上评论 'force context save'。我不能相信它,也不知道它有多可靠,或者它可能有什么副作用,但它可能有助于获得有关当前任务的正确信息:
taskDelay (1); /* Force context save */
taskRegsGet (0, ®s); /* 0 task-id for myself */
trcStack (®s, NULL, 0); /* NULL function pointer for default print fcn, 0 task-id for myself */
出于故障排除原因,我希望能够检索并打印当前 运行 函数的调用程序堆栈。 我尝试了以下方法:
/*******************************************************************************
* *
* * 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());
}
但我得到:
JPAX-DP> DbgTest
trcStack aborted: error in top frame
value = 0 = 0x0
这可能吗?我怎样才能做到这一点?我看到,对于 taskRegsGet(),他们说:
This routine only works well if the task is known to be in a stable, non-executing state. Self-examination, for instance, is not advisable, as results are unpredictable.
但我还应该应用什么其他方法?
编译器是diab
和cpu arch powerpc
如果您的编译器是 GCC 并且您的体系结构的调用约定允许它(x86 是第一个想到的),我建议使用 __builtin_return_address(unsigned int level)。更多信息可以在这里找到: https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html.
您提到 taskRegsGet() 提到不建议从当前 运行 任务调用。然而,我看到有人使用 taskDelay(1) 并附上评论 'force context save'。我不能相信它,也不知道它有多可靠,或者它可能有什么副作用,但它可能有助于获得有关当前任务的正确信息:
taskDelay (1); /* Force context save */
taskRegsGet (0, ®s); /* 0 task-id for myself */
trcStack (®s, NULL, 0); /* NULL function pointer for default print fcn, 0 task-id for myself */