C++ Linux和Solaris Unix:函数末尾的Coredump
在重载条件下,我们观察到堆芯倾倒非常随机。当我们加载核心文件并查看核心转储的位置时,它总是指向函数的最后一行,即右大括号的行号 该函数有一些遗留的goto语句。当我们之前遇到类似问题时,我们将所有本地对象的创建移到了函数的顶部,这似乎解决了Solaris Unix 10上的问题。(我们的怀疑和一些示例测试表明,当执行goto语句时,这些局部变量中的一些从未被创建,但它们的析构函数总是被调用。因此,将它们一直移动到顶部可以确保它们始终被正确构造)。但是这个问题在Linux上仍然存在,而在Solaris上我们再也看不到这个问题了 使用堆栈跟踪更新:C++ Linux和Solaris Unix:函数末尾的Coredump,c++,linux,unix,solaris,coredump,C++,Linux,Unix,Solaris,Coredump,在重载条件下,我们观察到堆芯倾倒非常随机。当我们加载核心文件并查看核心转储的位置时,它总是指向函数的最后一行,即右大括号的行号 该函数有一些遗留的goto语句。当我们之前遇到类似问题时,我们将所有本地对象的创建移到了函数的顶部,这似乎解决了Solaris Unix 10上的问题。(我们的怀疑和一些示例测试表明,当执行goto语句时,这些局部变量中的一些从未被创建,但它们的析构函数总是被调用。因此,将它们一直移动到顶部可以确保它们始终被正确构造)。但是这个问题在Linux上仍然存在,而在Solar
#0 0x008a5206 in raise () from /lib/libc.so.6
#1 0x008a6bd1 in abort () from /lib/libc.so.6
#2 0x008de3bb in __libc_message () from /lib/libc.so.6
#3 0x00966634 in __stack_chk_fail () from /lib/libc.so.6
#4 0x08e9ebf5 in our_function (this=0xd2f2c380)
at sourcefilename.cc:9887
有人遇到过类似的问题吗?非常感谢任何帮助或指点来理解和解决问题。非常感谢 我怀疑您在向下增长的堆栈中溢出了缓冲区(大多数堆栈向下增长;我不知道Linux或Solaris是否在所有体系结构上都使用向下堆栈,但肯定有一些是这样)。此时,它覆盖返回地址,程序计数器跳转到非法地址,在函数返回的准确位置生成崩溃
只需修改它,它可能会告诉您发生了什么(或者更确切地说,溢出在哪里)。也许您可以提供一些代码来显示发生了什么?很简单,您有可能会破坏堆栈帧的bug,因此返回时它会崩溃。我建议用Valgrind来研究它,但是没有实际的代码,我们不能帮助。C++有一个规则,即GOTO不能跳过对象的构造,这正是你所概述的原因。因此,如果您有执行此操作的代码,则不应编译。听我说,通过移动你周围的事物,只是掩盖了真正的问题,但是没有看到任何代码可以肯定。在C++和CTO的一些背景下,我明白如果我可以发布代码,它可能有助于看到这个问题。但是它的专有第三方库代码,所以我不能发布它。为了删除一点post,该函数几乎有2000行,并调用了许多其他对象和函数。谢谢Mark。我们将检查代码,并尝试valgrind,看看我们可以收集到什么。我发布了堆栈跟踪。_u_stack_chk_fail根据文档表明缓冲区溢出。我们无法使用valgrind运行,但我们从coverity静态分析报告中发现,我们正在覆盖函数中本地创建的数组。我们修复了阵列大小问题,现在这个问题消失了。非常感谢。我们在编译中使用了-fstack-protector选项,这迫使内核溢出。如果没有这个选项,我们就不会强制核心转储。我们使用和不使用此选项运行测试。关于此选项的一些注意事项如下: