Loading

调试程序

调试程序

一、通读查看

通读代码,检查各部分的实现是否与自己的算法相同,检查各部分的逻辑是否正确,即这么做是否能得到正确答案。

可以在实现的时候把自己想到的可能的易错点写下来,最后逐一查看是否全部避免了这些错误。

  • 条件:通用

二、输出过程变量

即看与自己的期望结果是否一致,如果不一致,则逆向追根溯源,找到第一个出现问题的地方。

  • 条件:有小样例

三、对拍

即不断地与有正确性的程序运行相同的输入,看他们给的输出是否一致,同时也可以为【输出过程变量】的调试方法提供小样例

  • 条件:容易造数据,有唯一解,或很简单就可以写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;
}
posted @ 2024-09-13 10:37  lupengheyyds  阅读(28)  评论(0)    收藏  举报