堆栈跟踪不完整时如何解决段错误

时间:2019-07-25 07:15:27

标签: c++ multithreading

我正在运行一个多线程c ++项目。它能够正常运行,但是一段时间后会出现分段错误。我在下面提供了堆栈跟踪。我感觉我正在覆盖一些内存块,但是我无法查明损坏的确切位置。

#0  0x00007f059e7862c7 in raise () from /lib64/libc.so.6
#1  0x00007f059e787af8 in abort () from /lib64/libc.so.6
#2  0x00007f059ced77d5 in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc++.so.6
#3  0x00007f059ced5746 in ?? () from /lib64/libstdc++.so.6
#4  0x00007f059ced5773 in std::terminate() () from /lib64/libstdc++.so.6
#5  0x00007f059cf2c105 in ?? () from /lib64/libstdc++.so.6
#6  0x00007f05a0135dd5 in start_thread () from /lib64/libpthread.so.0
#7  0x00007f059e84e02d in clone () from /lib64/libc.so.6

我尝试使用带有以下选项的valgrind运行我的程序。 valgrind --tool=memcheck --leak-check=full --show-reachable=yes --error-limit=no --log-file=valgrind.log ./my_program

Valgrind在堆栈跟踪上方提供了一些错误,我能够成功解决,现在valgrind报告仅显示堆栈跟踪。

任何人都可以解释一下为什么在分割错误后我无法捕获完整的堆栈跟踪。有什么办法可以更好地解决这个问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

当我的代码中出现段错误时,我用gcc -g编译代码,编译后我用valgrind这样的valgrind ./a.out执行程序。当valgrind执行代码并找到Seg Fault时,它将显示行和函数名称。

答案 1 :(得分:0)

由于内存处理失败,您似乎没有崩溃。 (或不仅是因为它)

您的堆栈中有std::terminate,您可以在here中进行阅读,但简短的版本可能是您有未处理的异常,一直到默认值处理程序,这是您将看到的唯一堆栈跟踪。

要获得更好的堆栈跟踪,可以尝试执行以下操作:c++ stack trace from unhandled exception?或在允许您捕获它们的调试器中运行。另外,请确保使用调试符号进行编译,以在应用程序中获得更好的位置。