在上一篇《Qt 软件调试(二)使用dump捕获崩溃信息》中我们结尾处提示大家先准备好windbg,windbg是非常强大的调试工具,对于我们进行代码调试和分析异常有着非常重要的意义。
在Qt软件调试这个系列的首篇,我们介绍了《Qt 软件调试(一) Log日志调试》,日志在调试过程中一般用于错误的粗定位,若是碰上复杂问题导致的崩溃,日志往往也爱莫能助。
但是,当我们掌握了windbg神器,那么对于异常问题点方可做到精确定位,指哪打哪。本下列笔者将和小伙伴们一起学习、沉淀,一起精进。
一、windbg入门简单示例
1.1 代码示例
// Demo1.cpp
#include <iostream>
#include <windows.h>
#include <sal.h>
int add(_In_ int x, _In_ int y)
{
int r = x + y;
return r;
}
int main()
{
int x = 10;
int y = 20;
int ret = add(x, y);
return 0;
}
注意,这这里我们选择的是x86的编译工具链。注意在【属性】中,关闭代码优化,并允许生成DEBUG调试信息信息
1.2 使用windbg调试程序
1.2.1 在windbg中启动演示程序
程序进入中断等待调试状态
1.2.2 设置符号表路径和源代码路径(有源码可以设置)
也可以通过命令设置:
.sympath // 查询路径
.sympath fix // 固定路径,会删除已添加的自定义路径
.sympath srv* // 添加微软的符号表
.sympath+ [符号表路径] // 添加自定义符号表路径
1.2.3 下断点进行调试
【断点设置方法1】:已知模块名进行设置
【断点设置方法2】:指定文件中的某行设置断点
bp Demo1!Demo1.cpp:XXX // 其中XXX是行号
【断点设置方法3】:通过指定起始地址,批量设置断点
1.2.4 调试
g // 程序运行到断点
F1 // [按键] 单步调试
.restart // 重启调试
qd // 退出调试
更多调试指令,在本系列加下来的篇章中我们再做更多介绍~
二、参考文章
1、《在WinDBG中手动设置断点》
2、https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/getting-started-with-windbg