Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux和Solaris Unix:函数末尾的Coredump_C++_Linux_Unix_Solaris_Coredump - Fatal编程技术网

C++ Linux和Solaris Unix:函数末尾的Coredump

C++ Linux和Solaris Unix:函数末尾的Coredump,c++,linux,unix,solaris,coredump,C++,Linux,Unix,Solaris,Coredump,在重载条件下,我们观察到堆芯倾倒非常随机。当我们加载核心文件并查看核心转储的位置时,它总是指向函数的最后一行,即右大括号的行号 该函数有一些遗留的goto语句。当我们之前遇到类似问题时,我们将所有本地对象的创建移到了函数的顶部,这似乎解决了Solaris Unix 10上的问题。(我们的怀疑和一些示例测试表明,当执行goto语句时,这些局部变量中的一些从未被创建,但它们的析构函数总是被调用。因此,将它们一直移动到顶部可以确保它们始终被正确构造)。但是这个问题在Linux上仍然存在,而在Solar

在重载条件下,我们观察到堆芯倾倒非常随机。当我们加载核心文件并查看核心转储的位置时,它总是指向函数的最后一行,即右大括号的行号

该函数有一些遗留的goto语句。当我们之前遇到类似问题时,我们将所有本地对象的创建移到了函数的顶部,这似乎解决了Solaris Unix 10上的问题。(我们的怀疑和一些示例测试表明,当执行goto语句时,这些局部变量中的一些从未被创建,但它们的析构函数总是被调用。因此,将它们一直移动到顶部可以确保它们始终被正确构造)。但是这个问题在Linux上仍然存在,而在Solaris上我们再也看不到这个问题了

使用堆栈跟踪更新:

#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选项,这迫使内核溢出。如果没有这个选项,我们就不会强制核心转储。我们使用和不使用此选项运行测试。关于此选项的一些注意事项如下: