6

我目前在大学学习C。我的任务是编写一个 C 程序,它在我的 PC 和大学的 PC 上提供正确的输出,但在教授的 PC 上却没有。教授在他的 PC 上向我提供了我的程序的输出,并要求我找出错误。

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

当我要求教授根据学校的计算机来标记作业时,他不同意并咆哮着说现实世界如果不能只在一台计算机上运行,​​我的程序就有错误。

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

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

4

3 回答 3

5

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

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

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

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

于 2013-06-02T00:08:05.627 回答
2

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

1a) 有意义的用户错误:如果文件不存在,向用户显示“Could not find file 'file.txt' in path C:\items”。不要只是继续前进。

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

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

于 2013-06-02T00:22:04.250 回答
1

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

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

其次,我将寻找与操作系统相关的代码。路径分隔符、硬编码sizeofs、little-big endian 问题等。

第三,我会尝试寻找类似的机器。当然,它可能是原始的,但由于它不可用,您可以查找虚拟机映像,或者检查亚马逊是否可以为您提供类似的东西(他们可以,但我不知道有哪些操作系统可用;我假设 OS X 不是)。

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

于 2013-06-02T00:11:54.123 回答