0

我有一个代码,它使用数字配方的标准例程来查找 3x3 矩阵的特征向量。虽然代码在 linux 机器上完美运行,但它在 mac 上因分段错误 11 而失败。使用 gdb,当我回溯时,我发现

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000140400008
0x0000000100002a88 in tqli (d=0x7fff5fbffaa4, e=0x7fff5fbffa98, n=3, z=0x140400000) at     ac_nr.c:402
402                         f=z[k][i+1];

其中 tqli 是数字接收器中的标准例程,并且 z 定义正确。我可以自信地这么说,因为在 linux 机器上,程序在执行过程中没有发现任何困难,并且给了我正确的答案。谷歌搜索无助于获得任何相关答案。任何人都可以暗示mac中发生了什么或如何继续解决这个问题吗?

非常感谢,

4

2 回答 2

3
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000140400008
0x0000000100002a88 in tqli (d=0x7fff5fbffaa4, e=0x7fff5fbffa98, n=3, z=0x140400000)
at     ac_nr.c:402
402                         f=z[k][i+1];

如您所见,您的z指针是 0x140400000,错误发生在 0x0000000140400008,即 8 个字节之后。这很可能是缓冲区溢出z(数组越界)。

为什么它在 Linux 中有效:这可能与分配策略有关,例如,如果 alloc 库以 16 字节的块为单位分配内存以提高性能,而您请求 8 字节的块,则将分配 16 字节。如果没有保护器或金丝雀,没有什么可以阻止您处理超出范围的一项,并且分配了相当于一项额外项的内容,您将不会遇到段错误。

但是在分配 8 字节块的机器上,相同的代码会崩溃。

我强烈支持 Andreas Florath 的建议:在 Linux 中对您的程序运行 valgrind 并检查越界访问。或者您可能想要验证z实际访问它的大小和位置。

于 2012-12-23T11:40:28.220 回答
0

我很确定您z的定义不正确(或者某些调用 conventon 设置或类似设置是错误的)。

很可能代码在 Linux 上“有效”,但在 Mac 上无效 - 可能是因为内存区域的排列方式不同,但我几乎可以肯定,问题出在您传递给 tqli() 的内容上 - 如果您查看d & e 值,它们看起来像 saen 地址(用于堆栈变量)。z 值是完全不同的范围,出错的地址就在那之后,所以可能是第一次读取[我敢打赌ik如果你在调试器中检查变量,它是零]。

于 2012-12-23T11:36:57.677 回答