【发布时间】:2017-12-01 04:56:29
【问题描述】:
出于故障排除的原因,我希望能够检索并打印当前正在运行的函数的调用者堆栈。 我尝试了以下方法:
/*******************************************************************************
* *
* * 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(),他们说:
此例程仅在已知任务处于稳定状态时才有效, 非执行状态。例如,自查是不可取的, 因为结果是不可预测的。
但是我应该采用什么其他方法呢?
编译器是diab 和cpu arch powerpc
【问题讨论】:
-
你可以使用 backtrace(),如果它在 vxworks 中可用,它的手册页也有一个工作示例
-
@Harry 你可以访问源代码和 WindRiver Workbench 吗?
-
@cerr 是的,我可以访问源代码和 Windriver 工作台
-
@Harry 我或许可以为您提供帮助,但需要了解您的应用程序的更多细节。让我知道如何在此论坛之外与您联系以进行进一步讨论...
-
@cerr 我的邮件 ID 是 harry19892010@outlook.com
标签: c debugging stack trace vxworks