6

背景

在迁移到更新版本的 CC 编译器时,一个段错误出现在一个可以正常工作的模块中。

迄今为止的观察

  1. 从核心文件中,我可以了解段错误起源于什么功能。当我观察该功能时,我找不到任何可疑之处。

  2. 第一个主要问题是段错误仅在“发布”(打开优化)编译时重现,而在“调试”时没有重现。此外,段错误不会在 g++ 上重现。

  3. 现在我开始使用打印,并且出现了一个更大的问题 - 当添加cout/ printf(二进制搜索段错误行/打印指针的值)到代码中的某些行时,段错误没有重现。此外,我在维护段错误的代码的某一行中添加了一个 cout,这可能意味着段错误发生在该行之前。该行之后的注释行使段错误消失。

对我来说,这尖叫着内存损坏(特别是堆栈),但我不知道如何在不查看生成的程序集的情况下推进这一点。

有任何想法吗?提前致谢。

我正在研究 SunOS_5.10_Studio_12_5.12_64,CC 版本“Sun C++ 5.12 SunOS_sparc 2011/11/16”

回复评论的更多细节

  1. 代码是单线程的。
  2. valgrind 在 Solaris 上不可用,因此不相关。
4

1 回答 1

2

您应该使用像valgrind这样的内存调试器/分析器。它会很快告诉你腐败的位置。在 Solaris 上,您可以尝试libumem

于 2012-07-25T15:49:20.510 回答