调试期间没有错误,但是在正常执行期间错误

No error during debug but error during normal execution

本文关键字:执行期 错误 有错误 调试      更新时间:2023-10-16

我正在执行一个多线程程序,有时我会收到细分故障。因此,为了有效调试此故障,我将使用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将在程序的环境中设置LINESCOLUMNS,如果它们不存在,则将它们创建它们。这将改变环境的大小,因此,在GDB下运行时,程序的堆栈基础将有所不同。您可以在启动程序之前键入(gdb) unset environment COLUMNS(gdb) unset environment LINES从环境中删除这些变量。

  • GDB监视动态库事件和线程创建,在发生时短暂停止执行。