QQ:1075200597 WX:HCccc-orz 转载时请标注来源
作为一名Qter,我们必须得掌握关于QtCreator的一切调试方法。对于初学者来说,最致命的就是各种报错及crash。
1.如何去看我的程序最后Crash的地方?
首先,我们要专注IDE左边的按钮的作用。依次往下来讲。
第一个是我们编译的版本,Qt分为Debug,Profile,Release三个版本。其中Debug和Profile是能够输出qDebug信息的,而Release是默认不输出qDebug信息的。并且相较于Debug和Profile来说,Release版本是不带任何调试信息的。所以在开发的时候我们要选择Debug版本。发行的时候选择Release版本。
第二个是运行。即开始编译程序,生成EXE。
第三个是断点调试,即开始调试模式。
第四个则是构建。重新生成调试信息等。
而我们要着重关注与第三个,及断点调试。
当程序出现问题,我们要关注以上这些地方。
比如我在按钮这里加了个断点。会告诉我程序目前所在的线程id,当前的所有变量属性及当前所在的函数。
当我们程序出现Crash,即便没有添加断点。系统会在crash的地方停留,这时候我们要关注程序目前所在函数。这将帮我们定位问题。
如果我QtCreator给我停留的并不是我所写的函数,我要怎么查看呢?
首先,我们要在函数列表中向下翻阅,查看是否有自己所写函数,如果有,说明程序最后死在了这个函数上。如果没有,例如段错误等。我们要看程序给我们报了说明错误
2.学会查看报错内容
(1)segmentation fault
段错误一般产生原因为,内存错误。如何去搜索段错误,便是从我之前说的,关注当前停留函数的位置,关注右侧变量值。必要时通过断点,一步步去调试。
(2)0xc00000005
出现原因为。指针问题。一般来说是野指针或者空指针调用了。这个就十分好查阅了。开启断点调试,IDE就会帮我们自动查到。
(3)index out of range
请记住,当使用容器获取值时,千万不要使用下标去访问,而是使用.at访问,否则在release模式下,MSVC会优化越界问题(访问越界但程序不会奔溃)。越界问题也比较好找,直接查询容器访问,然后观察右侧的容器大小等等。
(4)stack overflow
栈溢出的情况下,可能是因为大规模的递归导致占用太多的栈资源,导致了爆栈问题。
以上就是最常见的问题。
3.程序打包后提示找不到库。
当我们写好程序,想让其他人也能使用的时候,我们需要windeployqt来打包发现我们的程序。但是当我们打包好后却发现找不到相应的动态库。
(1)开发时是否使用到三方库,因为Qt并不会自动帮你将三方库dll打包,所以需要自己手动放置(Pro中也可以配置将三方库自动打包)
(2)如果报错的是Qt自带库,从对应的编译器版本目录下手动放置dll。
(3)及时我都检查了,我还是不知道有什么库没有包含(最重要的)
首先打开我们的Qtc,还记得我们之前说的模块名称吗?没错哪些就是我们所需要的dll。在对应的目录下去搜索缺少的dll文件,放置到exe目录下即可。
4.我更新了我的UI,但是编译运行后,界面没有发生变化
我们的所有ui文件的后缀名为.UI文件,里面存放了我们的界面XML信息。
Qt有个工具叫做uic,这个工具主要将我们的.ui文件->ui_xxx.h文件,当我们更新ui的时候,.ui文件可能更新,但是ui_xxx.h文件并没有更新,怎么去解决这个问题呢?首先执行这三个步骤
如果执行这三个步骤都不起作用。可以取消shadow build,将build目录变成工作目录,这样在更新的时候ui_xxx.h文件就是唯一的了,又或者是将构建目录删除,重新编译,当执行这些步骤后,就能够看到界面更新了。
今天我们主要讲的是关于Qtc的调试,但是实际上这些只能帮助我们在开发时减少BUG的产生,但是到实际生产环境时,我们该如何调试?请看下文。