2011-09-19 36 views
2

我在Vxworks + PPC 603中发现异常“无效的程序计数器地址”。什么能导致程序计数器有一个无效的地址?

应用程序正在链接到多个“C”库。无法放置,可能会导致此问题?

错误的编译选项可能会导致这种情况吗?

任何方向或指针都会有帮助。

感谢

UPDATE:

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

在其中一轮测试中,我发现在函数指针中,函数地址值减1.如果函数地址是0x009a3730,那么PC的地址是0x00913729。另外,如果我更改编译器选项,崩溃的位置或发生崩溃后的运行次数会发生变化。

+0

你是否正在通过函数指针进行任何函数调用? –

+1

可能是你的堆栈被破坏,并且你从一个函数返回时将一个无效地址弹出到PC中。 –

+0

@Oli Charlesworth,是的,我只通过函数指针进行大部分函数调用。 – Jay

回答

0

@All,钍函数的局部变量为您提供建议。

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

该结构的内存应该是通过调用我们的某个函数来分配的。但是,它只是指向一些没有任何初始化或内存分配的Garbade内存,并且最终指向存储全局结构的静态内存。这导致了静态结构被破坏,导致崩溃。

对我们的日志进行全面的逐行分析有助于将所有碎片放在一起。

2

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

+0

我正在使用一个结构,其成员是函数指针。结构本身是静态的,静态结构的地址正在传递。但是,我不了解如何根据您的答案来解决此问题。你能否详细说明一下?感谢您的回复。 – Jay

+0

@Jay:基本上,您将需要调试您的应用程序以找出函数指针已被损坏的位置。你可以将观察点放在你的'static'结构中的函数指针上,并观察它被修改的位置。 –

0

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

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

  1. 回溯
  2. “拆解”代码崩溃
  3. 信息注册区域周围 - >在寄存器值飞机坠毁的时间
  4. 信息当地人 - >内,它坠毁
相关问题