C segfault仅在不使用调试器时出现
我有一个多线程C程序,它在程序中的特定点上始终生成分段错误。当我使用gdb运行它时,不会显示任何故障。您能想出为什么只有在不使用调试器时才会发生故障的原因吗?不能用它来发现问题真是令人讨厌 通过调试它,您正在更改它运行的环境。听起来您正在处理某种竞争条件,通过对其进行调试,事情的日程安排略有不同,因此您不会遇到问题。或者说,东西是以稍微不同的方式存储的,所以它不会发生。您是否能够在代码中添加一些调试输出以帮助解决问题?这可能影响较小,并允许您找到您的问题。经典。来自维基百科: 时间也是海森堡的一个因素。与正常执行相比,在调试器控制下执行程序可以更改程序的执行时间。当程序被调试器中的单步源行减慢时,对时间敏感的bug(如争用条件)可能不会重现。当行为涉及与不受调试器控制的实体的交互时,尤其如此,例如在两台计算机之间调试网络数据包处理时,只有一台计算机受调试器控制 调试器可能正在更改计时,并隐藏竞争条件 在Linux上,GDB还禁用地址空间随机化,您的崩溃可能与地址空间布局有关。尝试C segfault仅在不使用调试器时出现,c,debugging,gdb,segmentation-fault,C,Debugging,Gdb,Segmentation Fault,我有一个多线程C程序,它在程序中的特定点上始终生成分段错误。当我使用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进行验尸。“设置禁用随机化”为我解决了一个类似的问题!