C奇怪的虫子......把我的头发拉出来

时间:2010-11-03 07:11:01

标签: c

我的代码在当天早些时候在unix机器上运行了,但是在windows下编译时它给了我完全奇怪和错误的输出。

由于我们的代码将基于unix上的编译进行标记,我认为嘿,这已经足够了。但是现在我刚刚完成了我的代码重构(基本上只是添加了注释,摆脱了程序中从未使用的变量,并且摆脱了我编写的一些函数来测试程序)现在突然我的代码似乎给了我Windows上的正确输出和unix上的错误输出。

请注意,我没有做任何修改代码功能的事情。

经过这么多小时的努力,在本周撞击Seg Fault错误之后,这个最后一分钟的错误将把这一切都浪费掉。当虫子似乎随机出现时我该怎么办?

编辑:程序应该读取类似于html文件的文件并打印出表格。我正在将每个单独的单元格的数据加载到链接列表中的节点上,然后基于算法打印出信息。输出在Windows上正常工作但在unix上没有。我甚至不知道我需要查看哪部分代码,因为我不知道是什么导致了这一点。

7 个答案:

答案 0 :(得分:5)

根据您提供的信息量(旁边没有),最好的猜测是寻找未初始化的变量。这将在不同平台上产生不同的输出,并且是C中常见的初学者错误。

答案 1 :(得分:4)

我建议您使用 gdb 来调试代码并检查分段错误产生的位置。即使您不记得做过任何修改,这也会给你很好的启示。

网上有大量文档。 这些是基础知识:

  

壳> gdb myprogram

     

GDB>回溯#列出步骤直到出现分段错误

     

GDB>选择2#您可以选择任何您想要的步骤(例如2)

     

GDB>打印数字#print变量黑客攻击

gdb有很多功能。我想这会很快给你一个提示。 不要忘记下次使用版本控制系统。这是一种安全而美观的方式,可以让您的代码井井有条,干净利落地避开这些可怕的事故。 (SVN或GIT足够酷)

答案 2 :(得分:4)

答案 3 :(得分:1)

首先,我们需要您的代码才能看到正在发生的事情。但是如果你描述的是真的那么你的代码最有可能包含所谓的未定义行为。由于太多原因(例如跨越数组边界,错误地删除指针等),可能会发生未定义的行为。所以,没有代码就没有什么可说的

答案 4 :(得分:1)

通过valgrind运行。

我可以保证你会在valgrind找到你的错误。

如果你有权访问unix或linux机器,你就不应该发布你没有通过valgrind运行的代码,即使代码有效。

答案 5 :(得分:0)

根据您提供的数据,这是我的解决方案。

  1. 暂停一段时间并暂时退出问题域。
  2. 使用调试器,逐步执行程序,确定它是segfaulting的位置。
  3. 在segfault点打印数据并验证它。
  4. 那应该可以解决问题。

答案 6 :(得分:0)

使用所有警告编译您的代码。

不要隐藏伪造演员的警告,但要认真对待并解决实际问题。

使用不同的编译器。在linux clang上是一个很好的选择,并且比gcc提供更多的指示。