如何检索当前正在运行的函数堆栈的堆栈跟踪?

5

为了解决问题,我希望能够检索和打印当前正在运行的函数的调用堆栈。

我尝试了以下方法:

/*******************************************************************************
 * *
 * * 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, &regs);
    trcStack (&regs, (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架构是 powerpc

2个回答

1

很遗憾,我使用的是PowerPC和Diab编译器。 - stdcerr
虽然需要更多的工作和迭代过程,但你可以编写一些内联汇编代码将链接寄存器的内容移动到一个C变量中,以便打印。除了必须使用Diab支持的文档不完善的内联汇编语法之外,这种方法的主要缺点是只能找到当前函数的调用者。要获取下一个调用,必须修改调用函数以获取链接寄存器的内容。我在ARM和PPC卡上使用过这种技术,但这是最后的手段。 - vxWizard
你能在任务上执行“tt”吗?在vxWorks shell中输入tt <taskName>。同时尝试为任务设置以下选项,看看是否有帮助:“taskOptionsSet <taskName>, 2, 0”。 - Vikash Jain

1

您提到taskRegsGet()函数不建议从当前运行的任务中调用。但是我看到有人使用taskDelay(1)函数并添加了“force context save”的注释。我无法为此负责,也不知道它的可靠性或可能产生的副作用,但它可能有助于获取有关当前任务的正确信息:

taskDelay (1);     /* Force context save */
taskRegsGet (0, &regs);   /* 0 task-id for myself */
trcStack (&regs, NULL, 0); /* NULL function pointer for default print fcn, 0 task-id for myself */

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接