最近遇到一个在用户电脑崩溃,在开发机正常的bug,调试dmp文件定位不到源码,这时候就要用到远程调试了。
调试经过:
1. VS调试dmp文件看不到源码,定位到Qtcore.dll(未加载Qtcore.pdb)
2. 使用windbg调试dmp文件,只能看到汇编代码,显示QStirng::QString + 8 INVALID_POINTER_READ
3. 使用VS远程调试器调试用户机器,最终定位到QStringList.first()处
原来QStringList::first返回的是首元素的引用,必须保证QStringList是非空的,否则就像解引用了end()一样崩溃
VS远程调试步骤:
1.被调试机器新建一个共享目录share,用于放相关dll和资源文件
2.被调试机器新建一个账号,用于开发机器访问共享目录
3.将exe依赖的debug模式下的dll和资源文件拷贝到被调试机器共享目录(例如Qt5cored.dll)
4.将C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger目录拷贝到目标机器,根据平台启动X86下的msvsmon.exe,设置无身份验证,允许任何用户进行调试,最长空闲时间为0
5.设置开发机
1. VS项目属性->常规:
输出目录:\\目标机器IP\share\
2. 项目属性->调试:
- 选择远程windows调试器
- 远程命令: \\目标机器IP\share\$(ProjectName).exe
- 工作目录:\\目标机器IP\share
- 远程服务器名称:目标机器IP
- 连接:不带身份验证的远程访问
- 部署目录:\\目标机器IP\share
3. 开始调试,选择远程Windows调试器
bug原因:
解引用了空迭代器。
以后对于返回引用的API必须小心,判断引用是否有效
解引用迭代器同理
远程调试的缺点:
由于是客户端软件,要重现bug必须在被调试机器操作客户端才能运行到相关代码
远程调试必须要用户提供帐号密码访问共享目录,还得远程操作软件(或者用户手动)
这样调试对于用户是很不友好的