当前位置: 首页 > news >正文

Qt源码调试步骤记录

1.源码:

两种方式,要么安装qt时选择source,要么从官网下载源码,然后在qt creator中设置路径。二选一即可。我选的第二种。

1.1.第一种,安装时选择source:

1.2.第二种,下载源码+设置路径:

我用的qt版本是5.14.2,所以源码路径是:

https://download.qt.io/archive/qt/5.14/5.14.2/single/qt-everywhere-src-5.14.2.zip

解压缩以后,这种qt creator中设置路径。“工具”》“调试器”》“概要”:

按照图片中标记的数字顺序操作,主要是路径,直接是源码根目录即可。

到这里,qt源码本身就设置好了。要像调试自己代码一样可以打断点逐句调试,还需要pdb调试信息(符号表)。

2.调试信息:

所谓调试信息也是一些文件,我认为就相当于一些索引锚点,逐一对应了代码位置,所以调试的时候才有断点和逐句调试。显然这东西与源代码有关,qt有多少的代码模块,就得相应有多少调试信息。从官网下载地址就能看出来。而且它是和编译器相关的。

https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5142/qt.qt5.5142.debug_info.win64_msvc2017_64/5.14.2-0-202003291224qtbase-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64-debug-symbols.7z

就如上面的链接这样,我下载的是win64下的5.14.2,msvc2017编译器相关的debug_info。本来我用的编译器是mingw73_64位,但是我没找到相关的debug_info,用msvc一样道理。

但是注意,下载那里有很多debug_info,看名字就知道,跟qt源码对应的,我只下载了qtbase相关的,如果真实项目中需要,再对号入座就行了。

下载以后解压缩, 一看就知道,正好对应qt安装的编译器目录层级,复制过去合并就行了。

比如我本机的路径是D:\Qt\Qt5.14.2\5.14.2\msvc2017_64,把刚才解压缩的目录复制过来合并即可。

至此,准备工作已经做好了。可以直接开始调试。

3.调试:

随便新建一个项目,但是调试的时候,编译器一定的要和debug_info使用的一样。比如上面我下载的msvc2017,那么调试时也要选择msvc2017。

在main函数的a.exec那里打个断点,然后运行程序。

会发现下面的“WinMain”居然是亮色的,可以跟踪进去了。点进去看看。

可以看到main函数被调用的过程。

回到main函数,按f11进入细节。

然后就不用细说了。可以一直f11跟踪下去。

但是要注意,它不能像调试自己代码一样直接转到定义。比如上面这样,把鼠标移动到return QGuiApplication::exec();的exec那里,按住ctrl直接点击的话,它不是直接跳转到这个exec函数体定义,而是跳转到声明。只能接着按f11跟进去,然后再按ctrl+点击就可以在声明和定义之间切换了。

就按上面说的,一直跟踪下去,发现exec函数最根本是这样的:

是不是跟我们写多线程时,使用的事件循环一样啊?此处顺便提及一下我以前写的博客记录,可以前后联想一下。

【Qt线程-2】事件循环(QCoreApplication::processEvents,exec)的应用-CSDN博客

其实,继续跟踪qt的事件循环处理,会发现它最终本质就是手册里说的那样,其实是消息队列处理。再往深的说线程和movetothread,本质上还是基于消息队列。

4.总结:

所以,源码调试多好玩,可以深入学习和理解qt的运作机制。大家一起动手来玩吧。

http://www.lryc.cn/news/329049.html

相关文章:

  • 大数据面试英文自我介绍参考(万字长文)
  • 外包干了5天,技术退步明显.......
  • Docket常见的软件部署1
  • Qt源程序编译及错误问题解决
  • 作业练习(python)
  • Wireshark使用相关
  • 相机标定学习记录
  • CSS 滚动条样式修改
  • 谈谈配置中心?
  • 人工智能(pytorch)搭建模型25-基于pytorch搭建FPN特征金字塔网络的应用场景,模型结构介绍
  • JRT业务开发起步
  • 深度解析:国内主流音视频产品的核心功能与市场表现
  • 红黑树介绍及插入操作的实现
  • [linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器
  • 单例设计模式(2)
  • boost::asio 启用 io_uring(Linux 5.10)队列支持
  • Android 自定义坐标曲线图(二)
  • 每日OJ题_子序列dp⑧_力扣446. 等差数列划分 II - 子序列
  • GOPROXY 代理设置
  • Redis面经
  • 【c++】类和对象(六)深入了解隐式类型转换
  • 什么是nginx正向代理和反向代理?
  • 【Go】面向萌新的Gin框架知识梳理学习笔记
  • baseDao增删改查.
  • 什么是面向对象【大白话Java面试题】
  • PyTorch 教程-快速上手指南
  • 【有芯职说】数字芯片BES工程师
  • 暴力破解pdf文档密码
  • 蓝桥杯刷题第四天
  • 03-数据库的用户管理