复制客户端计算机上的错误

时间:2013-06-01 23:55:23

标签: c debugging

我目前正在大学学习C语言。我的任务是编写一个C程序,它可以在我的PC和大学的PC上输出正确的输出,但不能在教授的PC上输出。教授在我的电脑上向我提供了我的程序输出,他已经让我找到了这个bug。

我查看了逻辑和预期输出,它们之间没有相关性。如果它在3台计算机中的2台上运行,那肯定不是逻辑错误。

当我让教授根据学校的计算机标记作业时,他不同意并喋喋不休谈论现实世界,如果它只在一台计算机上不起作用,我的程序就会出错。

所以我想问现实世界的专业人士他们会在这种情况下做些什么?如果程序没有提供给您的工具用于测试目的,您如何调试程序?也就是说,如果客户报告了您无法自行复制的错误,您可以做什么?或者你如何复制这个bug?

仅供参考,我的电脑是Windows,学校的电脑是linux,教授的电脑是Mac。

3 个答案:

答案 0 :(得分:5)

  

我查看了逻辑和预期输出,它们之间没有相关性。如果它在3台计算机中的2台上运行,那肯定不是逻辑错误。

欢迎来到未定义的行为:不幸的是,您的程序在两台(或两千台)计算机上产生正确结果的事实证明什么都没有。语言标准试图为编译器设计者提供尽可能多的自由优化,以便C ++程序的效率可以与使用汇编语言编写的程序保持竞争。不幸的是,这为平台之间的不兼容留下了很大的空间:不同的编译器和执行环境会对带有错误的程序产生截然不同的结果。最糟糕的是,带有错误的程序可能会产生一些你可能在某些平台上合理预期的行为,并对其他平台造成严重的崩溃!

防止未定义行为的唯一方法是编写正确的程序。编译器通过在他们认为可能发生未定义行为的地方产生警告来合理地帮助您。打开最精细级别的所有警告,编译程序,并修复编译器报告的所有警告。有可能,一些警告会解释计算机输出与教授计算机之间的差异。

要追踪高级错误,请使用valgrind。该程序将帮助您检测与内存相关的问题,例如写入已分配的区域,使用已释放的内存,多次释放同一块内存,等等。

答案 1 :(得分:2)

1)防御性编程。不要以为事情会奏效。你需要打开一个文件吗?检查它是否存在。你加载数据结构?检查数据结构是否正确。

1a)有意义的用户错误:如果文件不存在,请在路径C:\ items中向用户显示“找不到文件'file.txt'”。不要只是继续前进。

2)如评论中所述,记录所有内容。更多针对学校项目(性能不重要),将所有内容记录到文件中并检查程序正在执行的路径,以及(如果可能),为什么(数据结构值是什么)。

2a)鉴于密切关系,您可以定义一个测试用例,让教授在其计算机上运行。检查他的日志与你的对话。

答案 2 :(得分:1)

我绝对不是“现实世界的专业人士”,但我会尝试(并且会得到评论,我敢肯定):

首先,我会查看代码,并尝试查看是否存在任何“未定义的行为”。请参阅@ dasblinkenlight的回答。

其次,我将寻找与操作系统相关的代码。路径分离器,硬编码的sizeof,小大的端点问题等等。

第三,我会尝试找一台类似的机器。当然,它可能是原始的,但由于它不可用,你可以查找虚拟机图像,或检查亚马逊是否可以给你这样的东西(他们这样做,但我不知道有什么操作系统可用;我假设OS X不是。)

第四,我会尝试构建一个加载了调试助手和日志记录的版本,并将其交给客户端,如果他愿意帮忙的话。