c++ - 如何从这些信息中追踪错误代码

标签 c++ multithreading segmentation-fault gdb

我的项目非常大并且是多线程的。应该有一个导致整个程序崩溃的错误。

对于release版本,它有时会卡住,但不会经常出现。 对于调试代码,它更容易出现。 gdb 的堆栈跟踪如下。

0  clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:81
1  0x00007dff8270c700 in ?? ()
2  0x00007ffff6dde38d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

此信息不足以让我找到错误代码。

所以我的问题是:如何从崩溃中获取更多信息?对 gdb 或其他高级工具有任何高级使用吗?

=============更新==============

要补充的信息,在打印出所有线程 ID 后,我找出了崩溃的线程。线程的唯一区别是它与标准线程对象分离。如果有人对此有任何经验,请告诉我。

=============更新2 ================

这个问题还没有解决,结果是一个服务器问题。 如果我在终端中运行,它会使整个终端和当前以我的用户名运行的所有其他程序崩溃。 然后系统关闭并且有一段时间无法通过 ssh 访问。还有一些其他用户的管道坏了,似乎我的程序使 sshd 没有响应。

过了一会儿,我又能登录了,发现程序的二进制文件坏了(被截断了),需要重新编译。

最佳答案

对我来说,它看起来像是内存或堆栈覆盖或死指针或对象的访问。

为了捕获这类错误,我喜欢使用 efencevalgrind 等工具。对于实际的编译器,您还可以使用 thread sanitizer内存清理器。两者都适用于 clang 和 g++。

如果你不能发现问题,你还应该安装标准库的调试库版本。有时错误的值会在 g++lib 或其他一些库中崩溃,从而导致难以调试的情况。安装调试信息后,您可以更轻松地捕捉到这一点。

关于c++ - 如何从这些信息中追踪错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484033/

相关文章:

python - 从 python 中的共享库返回的数组 - 这是内存泄漏吗?

multithreading - nvidia Tesla 上的线程总数

c++ - Qt : Background thread refreshing UI thread

c++ - 如何在我的 Haxe/hxcpp 构建中包含 libsqlite3?

c++ - double 和算术

c# - 如何在 UI 中对计数器值进行动画处理以增加 C# WPF 中的值?

java - 带 Swing 的 keyListener 和带 Swing/keyListener 和 Thread 的游戏关卡系统

c - 为什么当 current->next == NULL 时 current = current->next 会出现段错误?

c - 地址未堆叠、分配或(最近)释放

c - C中的递归深度是否有任何硬连线限制