我有一个在 ARM uC 上运行的 VxWorks 应用程序。
首先让我总结一下应用程序;
应用程序由第 3 方堆栈和网关应用程序组成。我们已经实现了一个操作系统抽象层来支持操作系统的独立性。
底层堆栈有自己的内存管理和控制设施,它将内存块保存在一个双向链表中。
例如 ; 我们不直接执行 malloc/new , free/delege 。相反,我们调用 OSA 层的例程,它从 OS 获取内存并将其放入列表中,然后将此内存返回给应用程序。(例程:XXAlloc,XXFree,XXReAlloc)
当释放内存时,我们再次使用 XXFree。
事实上,这个块是一个结构,它有
- 魔术数字指示内存块的开始和结束 - 用户请求分配的大小 - 由于对齐问题而实际分配的大小 前一个和下一个指针 - 指向返回给应用程序的内存块的指针。显示应用程序中调用 xxAlloc 的位置的链接寄存器。
使用这种块结构堆栈可以检查块是否损坏。
我们还有从 Linux 移植的 pthread 库,我们用它来创建/终止线程(目前有 22 个线程) -同步对象(事件、互斥体..)
taskSpawn 调用了主任务,后来该任务创建了其他线程。
这是对应用程序及其 VxWorks 界面的描述。
问题是 :
其中一项任务突然被 VxWorks 破坏,没有提供有关问题所在的信息。我也有一个 jtag 调试器,它会命中 VxWorks taskDestoy() 例程,但调用堆栈既不提供 PC 也不提供任何信息 r14。
我怀疑代码中的特定例程,其中完成了巨大的 xxAlloc 但问题非常零星地发生,不知道我可以将它映射到源代码。
我认为操作系统会检测到异常并静默执行其处理。
任何帮助都会很棒
问候