相关环境信息:开发机Win7 x64、远程机器WinXP、调试器是CDB、Qt版本5.2.1
一、部署远程机器环境
我这里用的是虚拟机(Windows XP),根据你要调试的程序选择安装不同架构的WinDbg,因为安装文件不大,所以我一般都会装上
附上下载地址:
dbg_i386_6.12.2.633: http://download.csdn.net/detail/aqtata/7210807
dbg_amd64_6.12.2.633: http://download.csdn.net/detail/aqtata/7210817
安装过程很简单,下一步就行了。安装好后第一件事情就是设置调试符号路径,添加系统环境变量_NT_SYMBOL_PATH
值填写为SRV*D:\Symbols*http://msdl.microsoft.com/download/symbols
其中"D:\Symbols"是符号路径,根据自己的情况修改
接着回到本机,把QtCreator目录下的qtcreatorcdbext.dll复制到远程机器上
x86:"\lib\qtcreatorcdbext32\qtcreatorcdbext.dll"
x64:"\lib\qtcreatorcdbext64\qtcreatorcdbext.dll"
根据需要复制一个就行了,我这里复制的x86的,拷贝到"D:\DebugServer"下面
然后添加系统环境变量_NT_DEBUGGER_EXTENSION_PATH,并指向这个目录
二、部署Qt程序运行环境
Qt程序离不开它的那些个DLL文件,所以我们根据自身程序的依赖要把相关DLL拷进到调试机器上
一个Windows下的窗口Qt程序,至少需要4个DLL:Qt5Widgetsd.dll、Qt5Guid、Qt5COred、qwindowsd.dll
注意我这里拷贝的是调试版本,而且我的Qt是自行编译的,需要依赖的DLL没有官方安装版那么多
在Qt目录下的lib文件夹里找到相关DLL复制到远程机器
最后文件结构如下:
D:\DebugServer\qtcreatorcdbext.dll
D:\Qt\Qt5Cored.dll
D:\Qt\Qt5Guid.dll
D:\Qt\Qt5Guid.dll
D:\DebugServer\Qt\plugins\platforms\qwindowsd.dll
注意,因为Windows下的程序依赖qwindowsd.dll,而它是以插件的形式存在的,所以需要设置特别的路径
继续添加环境变量QT_PLUGIN_PATH,将其指向plugins目录
并将"D:\DebugServer\Qt"添加到PATH中,以便我们的程序在任何位置都可以运行起来
因为我这边是用的msvc2013编译器,把依赖的msvcp120d.dll和msvcr120d.dll也一起拷贝到Qt文件夹中了
这个其实拷贝到System32目录下也可以
三、开始远程调试
在本机新建一个窗口工程并在main.cpp中加一句输出当前系统版本号的语句
#include "mainwindow.h"
#include <QApplication>
#include <QSysInfo>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
qDebug() << QSysInfo::windowsVersion();
return a.exec();
}
生成Debug版,并将exe文件复制到远程机器的C:\下,完整路径是C:\Demo.exe
从CMD中启动cdb.exe(在WinDbg根目录下)并附上相关参数:cdb.exe -server tcp:port=123 c:\demo.exe
-server是启动调试服务,port设置了调试端口
第一次启动的时候可能要等一会,因为需要下载调试符号文件
当看到等待用户输入的时候表示已经可以开始调试了
回到QtCreator中选择"挂接到一个CDB会话..."
然后设置远程机器的IP和端口,点击确定
此时远程机器上的调试服务器已经开始工作了,第一次的话因为需要下载调试符号所以要等一会
最后可以看到调试窗口输出了"48",对应Qt中的枚举值QSysInfo::WV_XP