来自命令行的Segfaults但可以从GDB运行

时间:2012-12-07 14:10:02

标签: gdb

我真的迷失在这里。也许你们中的一些人可以指出我正确的方向。

我正在使用GCC over MinGW开发ANSI C工具。该工具仅从命令行运行。可能只在Windows机器上。它在本地详细说明了一些数据,并生成供其他程序使用的文件。基本上它做了很多数学和一些文件处理。没什么好看的。我没有发现有必要在这里发布整个1000多行进行检查......

我用GCC -ansi编译它,确保没有一个警告存在。随着开发的发展,一切都很顺利。但最近我开始得到(几乎)随机段错误。我检查了最后的更改,但一无所获。我删除了最后的更改完全恢复到它完美的工作。仍然是段错误。我逐行追踪。我回去阅读并重新阅读整个代码,搜索可能的指针/ malloc错误。我根本无法找到它经常随机失败的原因。

所以这是奇怪的事情 - 我用-g编译它并运行GDB。

start MSYS
change dir where the program resides
$ gdb generatore.exe (the one compiled -g that fails)
$ run

它完全适用于GDB。我一步一步走了。逐行。完善。我试着用大量的数据来强调它。一切都有效。无法重现错误。但是如果从命令行运行相同的可执行文件,它将失败。

我怀疑某个指针有不可预知的行为,但我无法在任何地方找到它。

有没有人遇到类似的东西?我应该在哪里检查?另外,我对GDB并不熟悉,因为它运行顺畅,我能以某种方式强制执行控制以找到失败的原因吗?是否有任何其他免费的Windows调试解决方案可以告诉我?如何针对不可预测的行为进行调试?

非常感谢您的关注, 格言

1 个答案:

答案 0 :(得分:0)

有一个很好的免费工具可以捕获指针,内存分配,解除分配等所有类型的运行时错误,这些错误在编译时无法捕获,因此编译器不会向您发出警告:valgrind {{ 3}}。问题是,AFAIK它不能在Windows上运行。但是,如果您的程序是纯ANSI C,那么您应该能够构建它并在Linux机器上使用valgrind运行它。

我不是百分之百确定它,但它应该在虚拟机中运行正常,所以如果你没有单独的Linux计算机,你可以尝试安装,例如在Virtual Box或VmWare中使用Ubuntu并尝试使用valgrind运行程序。