调试程序
调试程序
一、通读查看
通读代码,检查各部分的实现是否与自己的算法相同,检查各部分的逻辑是否正确,即这么做是否能得到正确答案。
可以在实现的时候把自己想到的可能的易错点写下来,最后逐一查看是否全部避免了这些错误。
- 条件:通用
二、输出过程变量
即看与自己的期望结果是否一致,如果不一致,则逆向追根溯源,找到第一个出现问题的地方。
- 条件:有小样例
三、对拍
即不断地与有正确性的程序运行相同的输入,看他们给的输出是否一致,同时也可以为【输出过程变量】的调试方法提供小样例
-
条件:容易造数据,有唯一解,或很简单就可以写spj
-
注意:data.cpp不能写错了,另一个程序一定是正确的。
四、构造数据
构造一些特殊的数据、意想不到的情况,使得程序很有可能是错误的,并让程序可能是错误的。自己卡自己,而不是让出题人卡自己。
- 条件:只能是小样例
五、断言过程
不仅要保证答案正确,还要保证整个过程都在掌控之中,结合assert,使得过程的条件与你的预期一致。
-
好处:可以避免本质错误但小样例、随机数据下正确的情况(拍不出来)。
-
条件:通用
六、gdb查RE
借助 MinGW 工具 gdb 进行程序运行过程的跟踪。首先需要在 C++ 编译环境中打开产生调试信息。
路径:"C:\Program Files (x86)\Dev-Cpp\MinGW64\bin\gdb.exe"
常用命令:
-
run/r运行程序kill结束程序 -
backtrace跟踪程序 -
b 行号/函数名在相应位置加上断点。 -
print/p 变量输出变量的值 -
c/conti/continue跳过断点,继续运行 -
d 要删除的断点编号直接delete删除所有断点。
参考:GDB调试指南
七、关于SPJ的对拍
int main(){
FILE* f=fopen("1.in","r"),*g=fopen("2.in","r"),*F=fopen("1.out","w"),*G=fopen("2.out","w");
fscanf(f,"%d",&n);fscanf(g,"%d",&m);
for(int i=1;i<=n;i++)fscanf(f,"%d",a+i);
for(int i=1;i<=m;i++)fscanf(g,"%d",b+i);
for(int i=1;i<=n;i++)fprintf(F,"%d ",a[i]);
for(int i=1;i<=m;i++)fprintf(G,"%d ",b[i]);
return 0;
}

浙公网安备 33010602011771号