我正在执行一个多线程程序,有时我会收到细分故障。因此,为了有效调试此故障,我将使用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
功能的情况下进行编译时,完全没有分割故障。
为什么调试器不像普通执行那样检测分段故障?
当您在GDB下运行程序时,与直接从外壳运行相比,执行将以几种方式不同:
-
gdb默认情况下,将禁用地址空间布局随机化(ASLR),以便为每次运行提供更多可重复的结果。但这可能会掩盖程序中的内存损坏错误。您可以通过在启动程序之前键入
(gdb) set disable-randomization off
来禁用此功能。 -
GDB将在程序的环境中设置
LINES
和COLUMNS
,如果它们不存在,则将它们创建它们。这将改变环境的大小,因此,在GDB下运行时,程序的堆栈基础将有所不同。您可以在启动程序之前键入(gdb) unset environment COLUMNS
和(gdb) unset environment LINES
从环境中删除这些变量。 -
GDB监视动态库事件和线程创建,在发生时短暂停止执行。