Qt调试

Qt调试
一.概述
  所谓程序调试,是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试。
一般的程宇调试主要分为以下几步:
  第一步,用编辑程序把编制的源程序按照一定的书写格式送到计算机中,编辑程序会根据使用人员的意图对源程序进行增、删或修改。
  第二步,把送入的源程序翻译成机器语言,即用编译程序对源程序进行语法检查并将符合语法规则的源程序语句翻译成计算机能识别的“语言”。如果经编译程序检查,发现有语法错误,那就必须用编辑程序来修改源程序中的语法错误,然后再编译,直至没有语法错误为止。
  第三步,使用计算机中的连接程序,把翻译好的计算机语言程序连接起来,并扶植成一个计算机能真正运行的程序。在连接过程中,一般不会出现连接错误,如果出现了连接错误,说明源程序中存在子程序的调用混乱或参数传递错误等问题。这时又要用编辑程序对源程序进行修改,再进行编译和连接,如此反复进行,直至没有连接错误为止。
  第四步,将修改后的程序进行试算,这时可以假设几个模拟数据去试运行,并把输出结果与手工处理的正确结果相比较。如有差异,就表明计算机的程序存在有逻辑错误。如果程序不大,可以用人工方法去模拟计算机对源程序的这几个数据进行修改处理;如果程序比较大,人工模拟显然行不通,这时只能将计算机设置成单步执行的方式,一步步跟踪程序的运行。一旦找到问题所在,仍然要用编辑程序来修改源程序,接着仍要编译、连接和执行,直至无逻辑错误为止。
  也可以在完成后再进行编译。
Qt关于调试的一些快捷键:调试 F5(Debug) 停止调试 Shift+F5 单步跳过 F10 单步进入 F11 单步跳出 Shift + F11 重启调试 Ctrl + Shift + F5 设置/切换 断点 F9
二.Qt中调试的方法
(一)、正确方法
1 首先,用QtCreator打开Qt工程,然后点击左下角的电脑图标,再在弹出的菜单中选择“Debug”。
在这里插入图片描述
在这里插入图片描述
2 接下来,在需要进行调试的代码部分设下断点。设断点的方法是在要设断点的代码行前的空白处点击鼠标。

在这里插入图片描述
在这里插入图片描述
3 如果想清除断点,则在该断点上再点击一下即可清除。
在这里插入图片描述

4 断点设好后,点击左下角的带放大镜的绿色三角形图标即可启动调试。

在这里插入图片描述
5 或者,点击菜单“调试”-“开始调试”-“开始调试”。
在这里插入图片描述
6 在调试过程中,若是想查看断点行某个变量的值,只需将鼠标移动到该变量上,稍后便会弹出提示条显示。例如,图中的str.length()的值为1。

在这里插入图片描述
7 如果想继续执行,则可点击下方绿色的小按钮;如果想结束调试,则点击红色方块按钮。
在这里插入图片描述
( 二)、常见错误 许多刚从VS转学Qt的朋友最容易犯的一个毛病是,忘记先设置为调试模式,就直接点击调试按钮运行程序。 这时,将会弹出一个警告对话框,提示你没有以调试模式构建程序。当然,也就没办法对程序使用相关的调试功能了。
在这里插入图片描述
在这里插入图片描述
(三)具体的调试方法
在这里插入图片描述
(1)相关概念
在这里插入图片描述

(2)单步调试
在这里插入图片描述

发布了0 篇原创文章 · 获赞 1 · 访问量 150
展开阅读全文

strcpy复制数组,程序异常奔溃

05-08

**问题:解释一下我备注错误的地方为什么会使程序崩溃。** ![图片说明](https://img-ask.csdn.net/upload/201805/08/1525738805_365440.png) 开发IDE:codeblock17.12 链接:https://pan.baidu.com/s/1wwoP4v_Y5xYJtH7WZIWjdw 密码:gm87 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct element { char *key; char *content; }element; char buf[2048]={0}; int get_elements(element **p,char * file_name) { FILE * fp=fopen(file_name,"r"); if(fp==NULL) { printf("打开文件失败!"); return -1; } *p=(element*)malloc(sizeof(element)); //char buf[2048]={0}; int index=0; while(!feof(fp)) { if(fgets(buf,sizeof(buf),fp)!=NULL) { (*p)[index].key=(char *)calloc(strlen(buf),sizeof(char)); //strcpy((*p)[index].key,buf);//错误 //strncpy((*p)[index].key,buf,strlen(buf));//错误 //strcpy((*p)[index].key,&buf[0]);//错误 strcpy((*p)[index].key,&buf[1]);//正确 memset(buf,0,sizeof(buf)); } if(fgets(buf,sizeof(buf),fp)!=NULL) { (*p)[index].content=(char *)calloc(strlen(buf),sizeof(char)); //strcpy((*p)[index].content,buf); strcpy((*p)[index].content,&buf[6]); memset(buf,0,sizeof(buf)); } printf("%s%s",(*p)[index].key,(*p)[index].content); index++; if((*p=(element*)realloc(*p,sizeof(element)*(index+1))) == NULL) { puts("error"); return -1; } //memset(*p+index,0,sizeof(element)); } fclose(fp); return index; } int search_element(element *p,int n,const char * key) { int i=0; for(i=0;i<n;i++) { //if(strcmp(p[i].key,key)==0)//p[i].key[3]是'\n'字符,key[3]是'\0'字符 if (strncmp(p[i].key, key, strlen(key)) == 0) { printf("%s",p[i].content); return 1; } } return -1; } //最好还是传指针的地址,不然就是野指针 int free_elements(element *p,int n) { int i=0; for(i=0;i<n;i++) { if (p[i].key) free(p[i].key); if (p[i].content) free(p[i].content); } free(p); return 0; } int main() { char file_name[]="dict.txt"; element *p=NULL; int n = get_elements(&p,file_name);//将词典的内容读到内存 search_element(p,n,"you"); free_elements(p,n); return 0; } ``` 工程文件包: 链接:https://pan.baidu.com/s/1FfHerOqcVlGoP3-vSvXMIA 密码:b1gu 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览