0

c++程序终止,没有异常或堆栈跟踪

我有一个多线程应用程序

如果我的一个线程因读取数组越界(或任何 seg 故障条件)而出现访问冲突,我的整个应用程序将立即终止。

如果这发生在我使用 Visual Studio 的 Windows 柜台上,我会得到一个很好的堆栈跟踪错误在哪里,以及问题是什么。

我迫切需要这种类型的调试环境才能在我的项目中取得成功。我有太多的线程和太多的开发人员运行项目的不同部分,以至于一个人不能正确处理异常,这会破坏整个项目。

我正在运行 Fedora Core 14 我正在使用 gcc 4.5.1 编译 gdb 是 fedora 7.2-16.fc14 我的 IDE 是 eclipse Juno 我正在使用 CDT 构建器 我的工具链是跨 GCC 我的构建器是 CDT 内部构建器

gdb 或 gcc 或 eclipse 是否有任何设置可以帮助我检测这些类型的情况?

4

2 回答 2

2

这就是应该发生的事情。在 Unix 下,您会得到一个完整的核心转储(您可以在调试器中检查),前提是您已授权它们。(ulimits -c——传统上,它们是默认授权的,但 Linux 似乎改变了这一点。)

当然,要从核心转储中获取任何有用的信息,您需要使用符号信息编译代码,并且以后不要剥离它。(另一方面,您可以将核心转储从您的用户机器复制到您的开发机器上,看看那里发生了什么。)

于 2013-03-19T15:21:49.103 回答
0

正如 James Kanze 所写,您肯定在寻找核心转储。

我只想补充一点,核心转储会向您显示程序崩溃的位置,这不一定与问题(内存损坏等)发生的位置相同。当然,一些越界读/写可能不会立即崩溃。

您可以通过在 glibc 中启用检查不正确的内存分配/释放来缩小搜索范围。最简单的方法是设置环境变量MALLOC_CHECK_。将其设置为2glibc 将在每次内存分配/释放时检查堆损坏,并在发现任何问题时中止程序(如果启用,则生成核心转储)。这通常有助于更接近真正的问题。

http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html

于 2013-03-19T16:09:00.457 回答