C 如何检索当前运行函数的堆栈跟踪';什么是堆栈?

C 如何检索当前运行函数的堆栈跟踪';什么是堆栈?,c,debugging,stack,trace,vxworks,C,Debugging,Stack,Trace,Vxworks,出于故障排除的原因,我希望能够检索并打印当前正在运行的函数的调用方堆栈。 我尝试了以下方法: /******************************************************************************* * * * * xxxTracePrint - stack trace print function * * * * RETURNS: OK or ERROR * */ static void xxxTracePrint (

出于故障排除的原因,我希望能够检索并打印当前正在运行的函数的调用方堆栈。 我尝试了以下方法:

/*******************************************************************************
 * *
 * * 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());
}
这可能吗?我该怎么做?我看到,对于taskRegsGet(),他们说:

只有在已知任务处于稳定状态时,此例程才能正常工作, 非执行状态。例如,自我检查是不可取的, 因为结果是不可预测的

但是我还应该用什么方法呢


编译器是diab和cpu archpowerpc

如果您的编译器是GCC,并且您的体系结构的调用约定允许它(首先想到的是x86),我建议使用内置返回地址(unsigned int level)。更多信息可在此处找到:
.

您提到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 */

您可以使用backtrace(),如果它在vxworks中可用,它的手册页有一个工作示例too@Harry您有权访问surce code&WindRiver Workbench吗?@cerr是的,我有权访问源代码和WindRiverworkbench@Harry我可能可以帮助您,但您的应用程序的更多细节需要了解。让我知道如何在论坛外与您联系以进行进一步讨论…@cerr我的邮件id是harry19892010@outlook.comUnfortunately,我使用的是powerPC和diab编译器,而这需要一个更为繁重的迭代过程,您可以编写一些内联程序集,将链接寄存器内容移动到可以打印的C变量中。除了使用diab支持的文档内联汇编语法之外,这种方法的主要缺点是只能找到当前函数的调用者。要获得下一个调用,您必须修改调用函数以获得链接寄存器内容。我在ARM和PPC卡中使用过这个,但这是最后的手段。你能在任务中做“tt”吗?vxWorks外壳上的tt。还可以尝试为任务设置以下选项,并查看它是否有助于“任务选项设置,2,0”。
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 */