【发布时间】:2017-02-23 07:22:21
【问题描述】:
我正在做一个多线程程序,有时我收到分段错误。因此,为了有效地调试此故障,我将使用gdb 函数。
通常,我会将我的所有目标文件写入一个 shell 脚本文件,如下所示。
g++ ObjectFile.o ObjectFile2.o LogicFile.cpp -lpthread LogicExe
为了调试,我只是在后面加了一个-g扩展。
g++ ObjectFile.o ObjectFile2.o LogicFile.cpp -lpthread LogicExe -g
接下来,我会使用这个命令gdb LogicExe,然后是run LogicExe。
尽管运行了多次,但完全没有分段错误,而当我在没有gdb 和-g 函数的情况下编译时会发生分段错误。
为什么调试器没有像正常执行那样检测分段错误?
【问题讨论】:
-
我的水晶球说你可能在某个地方遇到了竞争条件,并且调试器改变了线程之间的时间,以至于它不再(经常)造成麻烦。但是不看代码是不可能知道的。请在您的问题中发布SSCCE。
-
当您同时更改两件事情时,有时很难判断是哪个导致了问题。你可以试试这个:没有
-g编译的版本在使用gdb运行时是否会失败或正常工作? -
@MarkPlotnick 当我在没有
-g的情况下编译时,有时会出现分段错误,但是当我以-g和gdb格式运行时,无论有多少段错误都不会发生我运行它们的时间。 -
好的。 gdb 所做的一件事是禁用地址空间随机化。这在您每次调试程序时提供了一致的环境,但正如您所见,它可以掩盖某些错误。在
run之前将set disable-randomization off输入gdb,您的程序应该会正常运行。
标签: c++ multithreading debugging ubuntu segmentation-fault