如何从这些信息中跟踪错误代码

How to trace the buggy code from this information

本文关键字:跟踪 错误代码 信息      更新时间:2023-10-16

我的项目很大,而且是多线程的。应该有一个错误会导致整个程序崩溃。

对于发布版本,它有时会卡住,但不会经常出现。对于调试代码,它更有可能出现。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后,我找出了崩溃的线程。线程的唯一区别是它与std线程对象分离。如果有人对此有任何经验,请告诉我。

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

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

过了一段时间,我可以再次登录,发现程序的二进制文件已损坏(被截断),需要重新编译。

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

为了捕捉这类错误,我喜欢使用efencevalgrind之类的工具。对于实际的编译器,您还可以使用线程清理程序或memory sanitizer。两者都适用于clang和g++。

如果您不能发现这个问题,您还应该安装标准库的调试库版本。有时,一个错误的值在g++库或其他一些库中崩溃,这会导致难以调试的情况。安装调试信息后,您可以更容易地了解这一点。