我有一个很长的C代码。一开始我打开两个文件并在上面写一些东西:
ffitness_data = fopen("fitness_data.txt","w");
if( ffitness_data == NULL){
printf("Impossible to open the fitness data file\n");
exit(1);
}else{
fprintf(ffitness_data,"#This file contains all the data that are function of fitness.\n");
fprintf(ffitness_data,"#Columns: f,<p>(f),<l>(f).\n\n");
}
fmeme_data = fopen("meme_data.txt","w");
if( fmeme_data == NULL){
printf("Impossible to open the meme data file\n");
exit(1);
}else{
fprintf(fmeme_data,"#This file contains all the data relative to memes.\n");
fprintf(fmeme_data,"#Columns: fitness, popularity, lifetime.\n\n");
}
此步骤一切正常:文件已打开,并在其上写入两行。
然后我有一个随机过程的长期模拟,其代码对于问题的目的并不感兴趣:文件及其指针从未使用过。在这个过程结束时我有:
for(i=0;i<data;i++){
fprintf(fmeme_data,"%f\t%d\t%f\n",meme[i].fitness,meme[i].popularity,meme[i].lifetime);
}
for(i=0;i<40;i++){
fprintf(ffitness_data,"%f\t%f\t%f\n",(1.0/40)*(i+0.5),popularity_histo[i],lifetime_histo[i]);
}
然后我做两个文件的fflush()
和fclose()
。
如果我在笔记本电脑上运行代码,两个文件都会被填满。如果代码在远程服务器上运行,则文件fitness_data.txt
仅包含第一个打印,即以#
开头但不包含数据的打印。我要你注意:
鉴于所有这些信息,问题是:
为什么发生某个命令,总是以相同的方式和相同的代码使用,总是在服务器上工作,而在不同的服务器上它有时可以工作但有时却没有?
管理员:我不认为这个问题是重复的。通过调整代码(here)或添加fflush()
(here)和类似的东西来解决所有类似的问题。这不是代码中的问题(我的谦虚意见),因为在我的笔记本电脑上它可以工作。我打赌它适用于大多数人。
答案 0 :(得分:4)
我们无法确定这里发生了什么,因为我们没有完整的程序,也无法访问发生问题的服务器。但是,我们可以给你一些调试建议。
当一个C程序在一台计算机上的行为与另一台计算机的行为不同时,您首先要怀疑的是内存损坏。查找内存损坏的最佳工具是valgrind
。修复它报告的第一个无效操作并重复执行,直到它报告不再有无效操作为止。很有可能这个问题就会消失。
将警告级别尽可能高,并修复所有投诉,即使是那些看起来很傻的投诉。
您说您正在呼叫INSTALLED_APPS
和fflush
,但是您是否正在检查他们是否失败?彻底检查,如下:
fclose
如果更改正在编译的优化级别,问题是否会消失?如果是这样,您可能会遇到导致&#34;未定义行为的错误&#34;。不幸的是,有一些很多可能的方法可以做到这一点,我不能轻易解释如何查找它们。
使用像C-Reduce这样的工具将您的程序缩减为较小的程序,该程序仍然无法正常工作但足够短,无法在此处完整发布。
阅读并遵循文章&#34; How to Debug Small Programs&#34; ..