c++ - Linux 和 Solaris Unix : Coredump at the end of a function

标签 c++ linux unix solaris coredump

<分区>

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

该函数有一些遗留的 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 是否在所有体系结构上都使用向下堆栈,但肯定​​是其中一些)。此时,它会覆盖返回地址,并且程序计数器会跳转到一个非法地址,从而在函数返回的位置产生崩溃。

只需 Valgrind,它可能会告诉您发生了什么(或者更确切地说,溢出在哪里)。

关于c++ - Linux 和 Solaris Unix : Coredump at the end of a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7070940/

相关文章:

c++ - Ubuntu 16.04 上的 cpprest sdk (casablanca) 中的构建错误

c++ - Qt 将不完整的 JPEG 数据加载到 QPixMap 如何验证?

c++ - 允许模板中不完整类型的技巧?

linux - 如何向 iptables 添加异常?

c++ - 了解 32 位 C 编译器中的 sizeof(char)

linux - 使用 cron 备份文件时的不同时间戳

html - 使用 CentOS 中的脚本发送 HTML 格式的电子邮件在 MS Outlook 中不起作用

c++ - 使用设备文件符号链接(symbolic link)查找总线号和设备号

linux - 删除 shell 命令后的换行符

linux - 如何使用 find 命令获取 csv