vxworks栈回溯源码
时间: 2023-08-23 18:08:10 浏览: 134
在 VxWorks 中,可以使用 `taskShow` 命令查看任务信息,包括任务的栈信息。
例如,可以使用以下命令查看任务 "t1" 的栈信息:
```
-> taskShow t1
```
如果需要查看任务的栈回溯信息,可以使用以下命令:
```
-> taskRegs t1
```
这将显示任务 "t1" 的寄存器信息,包括栈指针(SP)和帧指针(FP)。使用这些信息,可以进行栈回溯。以下是一个示例函数,用于在 VxWorks 中进行栈回溯:
```c
void stackTrace(taskId)
{
REG_SET regSet;
int i;
char *pSymName;
SYM_TYPE symType;
int symLen;
char symBuf[256];
int framePtr;
int stackPtr;
int *pFrame;
FUNCPTR *pFunc;
int nargs;
int nlocals;
int *pArg;
int *pLocal;
if (taskRegsGet(taskId, ®Set) != OK)
{
return;
}
framePtr = regSet.fpReg;
stackPtr = regSet.spReg;
for (i = 0; i < 100; i++)
{
printf("Call #%d:\n", i + 1);
pFrame = (int *) framePtr;
pFunc = (FUNCPTR *) (*pFrame);
nargs = *((int *) (pFunc + 1));
nlocals = *((int *) (pFunc + 2));
pSymName = symFindByValue(sysSymTbl, (int) pFunc,
symBuf, &symLen, &symType);
if (pSymName == NULL)
{
printf(" Unknown function at 0x%x\n", (int) pFunc);
}
else
{
printf(" %s() at 0x%x\n", pSymName, (int) pFunc);
}
printf(" Args:\n");
pArg = pFrame + 2;
for (i = 0; i < nargs; i++)
{
printf(" %d: 0x%x\n", i + 1, *pArg++);
}
printf(" Locals:\n");
pLocal = pFrame - nlocals;
for (i = 0; i < nlocals; i++)
{
printf(" %d: 0x%x\n", i + 1, *pLocal++);
}
if (framePtr == 0)
{
break;
}
framePtr = *((int *) framePtr);
}
}
```
这个函数首先获取了任务的 FP 和 SP 寄存器值,然后从 FP 开始向上遍历栈帧,逐个打印函数调用和参数/局部变量。可以在需要进行栈回溯时调用此函数。
阅读全文