【问题标题】:segmentation fault 11 in mac, but not in linux, gcc compilermac中的分段错误11,但在linux中没有,gcc编译器
【发布时间】:2012-12-23 10:45:24
【问题描述】:

我有一个代码,它使用数字配方的标准例程来查找 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 中发生了什么或如何继续解决这个问题吗?

非常感谢,

【问题讨论】:

  • 你在linux下用valgrind运行程序了吗?
  • 仅仅因为它在 linux 上给了你正确的答案并不排除代码中存在内存错误的可能性。
  • 谢谢大家。虽然我没有尝试 valgrind,但我发现 d 的分配不正确,而 linux 机器大多按照 Isermi 的建议进行操作,并且没有显示为 seg 错误。再次感谢所有建议,现在松了一口气。

标签: linux macos gcc segmentation-fault numerical


【解决方案1】:
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 的大小以及您实际访问它的位置。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多