如何查找使用工具时不会发生的段故障

问题描述 投票:-2回答:3

我问这个问题是因为如果我使用Valgrind或GDB运行Ceg程序,则不会发生seg错误。但是,一旦我独立运行它,它就很容易重现,因为它将毫无故障地隔离故障。我已经注释掉了代码的各个部分,以使其得以运行,但是我仍然无法找到确切的原因。我担心它发生得较早,而显示得较晚。

更新:为了澄清,这是Linux上的C ++ 17。

c++ c++11 segmentation-fault gdb valgrind
3个回答
1
投票

[请确保您没有禁用核心转储(ulimit -c unlimited,尽管有相关的other config options),然后当程序崩溃时,您应该获得核心转储文件。

运行gdb program core以分析核心转储-gdb看起来就像您已使用它来运行程序,并且它撞到了停止它的信号。您可以进行回溯以查看堆栈,检查变量和内存等。


0
投票

在我看来,这是典型的比赛条件。您在代码中使用任何线程吗?如果是这样,在访问一些可能在其他线程中使用的数据时,请考虑使用std::mutex。我总是只能使用TONS的调试打印来调试这些东西,但是请注意,它们还会使您的代码变慢一点并消除竞争条件。


0
投票

Good不好的printf调试:)。使您的程序在崩溃点的大致附近放置面包屑(以控制台输出或写入日志的形式)。当您更好地了解崩溃点在哪里时,使面包屑变紧。假设您的崩溃是可以确定的,那么最终它将收敛于崩溃点。

另一种技术,为SIGSEGV安装信号处理程序。信号触发后,转储崩溃点寄存器,然后使用类似addr2line的方式将IP地址转换为源线。您需要模块的起始地址。

© www.soinside.com 2019 - 2024. All rights reserved.