与 Heisenbug 相反,分段错误仅在调试时出现,但程序运行正常
Opposite of a Heisenbug, segmentation fault that appear ONLY when debugging, but program works fine
我写了一个简单的 C 程序,其中有两个数据结构实现为 ADT,所以我为它们动态分配内存
一切正常,直到我决定在结构中添加一个 int 值,没有任何动态分配,经典的简单静态内存分配,但自从我添加它后我开始出现段错误在一个非常安全的函数中,根本不应该出现段错误。
我考虑过内存分配错误,所以我尝试不释放和重用我正在使用的指针变量,而是使用另一个变量,这样做程序运行良好。
一直以来我都不得不处理这种错误,这让我很生气,我重新启用了我之前所说的免费内容,重新编译并用 valgrind 制作了一个 运行。
令我惊讶的是,绝对没有内存泄漏,没有分段错误,没有任何类型的中断,只是关于 Conditional jump or move depends on uninitialised value(s)
的警告,但这是一个需要的行为 (if (pointer == NULL) { }
) 所以我直接从命令行 运行 可执行文件,一切正常,所以情况是这样的:
程序在结构中没有新的 int 值:
- 编译:检查
- 运行:检查
- Valgrind 分析:没有内存泄漏,只是警告
- 调试 (gdb):检查
在结构中使用新的 int 值编程:
- 编译:检查
- 运行:检查
- Valgrind 分析:没有内存泄漏,只是警告
- 调试 (gdb):段错误
所以我认为这与 Heisenbug 相反,Heisenbug 是一个只在调试时出现的错误,我该如何解决这个问题?
好的,感谢@weather-vane 和@some-programmer-dude 我注意到实际上我没有初始化 valgrind 抱怨的变量,我误解了 valgrind 警告,我正在阅读它作为 You should not use a if to check if variables are NULL
我写了一个简单的 C 程序,其中有两个数据结构实现为 ADT,所以我为它们动态分配内存
一切正常,直到我决定在结构中添加一个 int 值,没有任何动态分配,经典的简单静态内存分配,但自从我添加它后我开始出现段错误在一个非常安全的函数中,根本不应该出现段错误。
我考虑过内存分配错误,所以我尝试不释放和重用我正在使用的指针变量,而是使用另一个变量,这样做程序运行良好。 一直以来我都不得不处理这种错误,这让我很生气,我重新启用了我之前所说的免费内容,重新编译并用 valgrind 制作了一个 运行。
令我惊讶的是,绝对没有内存泄漏,没有分段错误,没有任何类型的中断,只是关于 Conditional jump or move depends on uninitialised value(s)
的警告,但这是一个需要的行为 (if (pointer == NULL) { }
) 所以我直接从命令行 运行 可执行文件,一切正常,所以情况是这样的:
程序在结构中没有新的 int 值:
- 编译:检查
- 运行:检查
- Valgrind 分析:没有内存泄漏,只是警告
- 调试 (gdb):检查
在结构中使用新的 int 值编程:
- 编译:检查
- 运行:检查
- Valgrind 分析:没有内存泄漏,只是警告
- 调试 (gdb):段错误
所以我认为这与 Heisenbug 相反,Heisenbug 是一个只在调试时出现的错误,我该如何解决这个问题?
好的,感谢@weather-vane 和@some-programmer-dude 我注意到实际上我没有初始化 valgrind 抱怨的变量,我误解了 valgrind 警告,我正在阅读它作为 You should not use a if to check if variables are NULL