Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C segfault仅在不使用调试器时出现_C_Debugging_Gdb_Segmentation Fault - Fatal编程技术网

C segfault仅在不使用调试器时出现

C segfault仅在不使用调试器时出现,c,debugging,gdb,segmentation-fault,C,Debugging,Gdb,Segmentation Fault,我有一个多线程C程序,它在程序中的特定点上始终生成分段错误。当我使用gdb运行它时,不会显示任何故障。您能想出为什么只有在不使用调试器时才会发生故障的原因吗?不能用它来发现问题真是令人讨厌 通过调试它,您正在更改它运行的环境。听起来您正在处理某种竞争条件,通过对其进行调试,事情的日程安排略有不同,因此您不会遇到问题。或者说,东西是以稍微不同的方式存储的,所以它不会发生。您是否能够在代码中添加一些调试输出以帮助解决问题?这可能影响较小,并允许您找到您的问题。经典。来自维基百科: 时间也是海森堡的一

我有一个多线程C程序,它在程序中的特定点上始终生成分段错误。当我使用gdb运行它时,不会显示任何故障。您能想出为什么只有在不使用调试器时才会发生故障的原因吗?不能用它来发现问题真是令人讨厌

通过调试它,您正在更改它运行的环境。听起来您正在处理某种竞争条件,通过对其进行调试,事情的日程安排略有不同,因此您不会遇到问题。或者说,东西是以稍微不同的方式存储的,所以它不会发生。您是否能够在代码中添加一些调试输出以帮助解决问题?这可能影响较小,并允许您找到您的问题。

经典。来自维基百科:

时间也是海森堡的一个因素。与正常执行相比,在调试器控制下执行程序可以更改程序的执行时间。当程序被调试器中的单步源行减慢时,对时间敏感的bug(如争用条件)可能不会重现。当行为涉及与不受调试器控制的实体的交互时,尤其如此,例如在两台计算机之间调试网络数据包处理时,只有一台计算机受调试器控制

调试器可能正在更改计时,并隐藏竞争条件

在Linux上,GDB还禁用地址空间随机化,您的崩溃可能与地址空间布局有关。尝试
(gdb)将禁用随机化设置为off


最后,
ulimit-c unlimited
和事后调试(Robie已经建议)可能会起作用。

也许在使用
gdb时,内存映射到一个位置,您的过/欠流不会破坏内存,从而导致崩溃。或者它可能是一种不再被绊倒的比赛状态。虽然听起来不直观,但你应该庆幸你的程序足够好,可以在你身上崩溃

一些建议

  • 尝试使用静态代码分析器,如free
  • 尝试malloc()调试器,如
  • 试着把它看一遍

  • 我以前完全有过这个问题!这是一个竞争条件,当我使用调试器单步执行代码时,我所在的线程速度足够慢,无法触发竞争条件。非常糟糕

    如果您使用的是
    gcc
    ,请尝试使用
    -Wall
    选项获取所有警告。如果您使用像Eclipse这样的IDE,它会自动执行此操作。

    这种错误会被调用,可能有很多原因。错误是否与窗口管理和/或User32.dll有关?我遇到过这样的问题,我的程序只在GDB中崩溃。问题是,当我运行程序时,一个未初始化的类成员变量仍然得到值0,但当我在GDB中运行它时,它有一个巨大的值,当我将它用作数组索引时,它会出错。与windows无关-我使用的是Linux 2.6.32-24-generic#43-Ubuntu。你尝试过安排核心转储吗?在调试器外部启动程序之前,请运行
    ulimit-c unlimited
    ,然后在转储核心后运行
    gdb myprogram core
    。gdb将能够对你的segfault进行验尸。“设置禁用随机化”为我解决了一个类似的问题!