【问题标题】:No error during debug but error during normal execution调试时没有错误但正常执行时出错
【发布时间】: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 的情况下编译时,有时会出现分段错误,但是当我以 -ggdb 格式运行时,无论有多少段错误都不会发生我运行它们的时间。
  • 好的。 gdb 所做的一件事是禁用地址空间随机化。这在您每次调试程序时提供了一致的环境,但正如您所见,它可以掩盖某些错误。在run 之前将set disable-randomization off 输入gdb,您的程序应该会正常运行。

标签: c++ multithreading debugging ubuntu segmentation-fault


【解决方案1】:

当您在 gdb 下运行程序时,与直接从 shell 运行相比,执行方式会有所不同:

  • 默认情况下,gdb 将使用disable Address Space Layout Randomization (ASLR),以便在每次运行时为您提供更多可重现的结果。但这可能会掩盖程序中的内存损坏错误。您可以在启动程序之前输入(gdb) set disable-randomization off 来禁用此功能。

  • gdb 将在您的程序环境中设置LINESCOLUMNS,如果它们不存在则创建它们。这将改变环境的大小,因此在 gdb 下运行时程序的堆栈基数会有所不同。在启动程序之前,您可以通过键入 (gdb) unset environment COLUMNS(gdb) unset environment LINES 从环境中删除这些变量。

  • gdb 监控动态库事件和线程创建,当它们发生时会短暂停止执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2016-03-27
    • 1970-01-01
    • 2018-04-05
    相关资源
    最近更新 更多