什么会导致程序计数器的地址无效?

时间:2011-09-19 15:10:58

标签: c debugging vxworks powerpc

我在Vxworks + PPC 603中收到“无效程序计数器地址”的异常。

应用程序链接到多个“C”库。无法放置,可能导​​致此问题的原因是什么?

是否有可能导致错误的编译选项?

任何指示或指示都会有所帮助。

由于

更新:

我有一个结构,其成员是函数指针。结构本身是静态的,它的地址被传递并通过结构调用不同的函数。

在其中一轮测试中,我发现在函数指针中,函数地址值减1.如果函数地址是0x009a3730,则PC有0x00913729。

另外,如果我更改编译器选项,崩溃的位置或发生崩溃的运行次数会发生变化。

3 个答案:

答案 0 :(得分:2)

如果指针值被破坏并稍后被调用,那么任何使用函数指针的情况都很容易导致这种情况。检查信号处理程序(如果有)以及处理回调的任何其他API。

答案 1 :(得分:0)

“如果功能地址是0x009a3730,则PC具有0x00913729”。这里的区别不是1 :)但PC总是指向它必须执行AFAIK的下一条指令的地址。

也许您可以在调试器中运行核心转储并打印出:

  1. 返回跟踪
  2. '反汇编'崩溃地区的代码
  3. 信息寄存器 - >在崩溃时注册值
  4. info locals - >它崩溃的函数的局部变量

答案 2 :(得分:0)

@All,谢谢您的建议。

事实证明,包含该地址的位置错误地指向另一个结构的引用成员,并且该引用成员在每次调用中减少了一个以释放该结构。

该结构的内存应该通过调用我们的一个函数来分配。但是,相反,它只是在没有任何初始化或内存分配的情况下引用一些服务器内存,它最终引用了存储全局结构的静态内存。这导致静态结构被破坏,并导致崩溃。

对我们的日志进行彻底的逐行分析有助于将所有部分组合在一起。