Mat*_*aus 21 c++ debugging qt qt-creator visual-studio-2017
我已经安装了Qt,但是在尝试从QtCreator中调试C++代码时遇到了错误.我在Windows上使用Visual Studio 2017,似乎没有安装QtCreator需要的调试器(cdb.exe).在使用MSVC2017编译器时,如何配置调试以在QtCreator中使用64位代码?
(我根据https://stackoverflow.com/help/self-answer回答我自己的问题.发布一个更好的答案,我会改变你接受的答案!)
Mat*_*aus 41
我在这里讨论的是让QtCreator使用Visual Studio 2017(MSVC2017)编译器 - 包括调试!默认安装MSVC2017和Qt 5.10将允许您编译和运行代码,但默认情况下您将无法获得调试支持.我将展示为以下参考系统安装所有内容(包括调试支持)所需的步骤:
我已经在Windows 10和Windows 7(x64)上测试了这些步骤,它似乎正在运行.请注意,与Qt安装程序捆绑在一起的QtCreator版本是32位版本,如果您尝试使用MSVC进行调试,它将无法开箱即用.这是记录在案的,但不是一步一步的(参见QtCreator Windows调试和QtCreator调试器引擎),并不是所有东西都放在一个地方,所以我将在这里提供关于如何使参考系统工作的简单说明我在上面描述.
假设您已安装Win7/Win10和MSVC2017,那么我们就开始吧!
安装适用于Windows 10的Windows SDK - https://developer.microsoft.com/en-us/windows/downloads/sdk-archive
安装这两个文件(x86版本是可选的):
注意:如果在安装Windows调试工具后安装QtCreator,QtCreator将自动检测调试器的位置,从而在创建工具包时省去麻烦.如果您已经安装了QtCreator,请不要担心,在QtCreator中配置套件如下所示.
在QtCreator用语或术语中,"Kit"是调试器+编译器+ Qt版本+其他的组合.(从这个意义上说,"Kit"这个词与我们在上面安装调试器时对"Windows Kits"的含义不同;这是一个不幸的名称冲突.)通过选择工具设置"QtCreator Kit" - >选项 - >构建和运行.我喜欢从最右边的标签开始,向左侧工作,以"套件"结束.原因是需要配置下面的所有标签(1,2,3)以制作完整的套件.
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe并为其命名,如"Window Kit 10 cdb x64".设置编译器.确保"Microsoft Visual C++编译器15.0(amd64)"在列表中.请注意,如果您已将内容安装到默认路径,QtCreator将自动检测这些位置.如果未列出,请将路径添加到编译器.
请注意,对于Visual Studio 2017 x64位,您需要"amd64"版本,即64位编译器.如果您想知道为什么列出这么多编译器 - 它们是"交叉编译器".这意味着它们针对不同的体系结构,例如,"x86_amd64"是一个32位进程,它创建了一个64位应用程序; 如果您在32位计算机上开发64位代码(因此称为交叉编译),您将使用此版本.由于本教程假设您在64位操作系统上运行,因此请使用amd64版本.("x86_amd64"交叉编译器也将生成64位代码.)当我第一次看到QtCreator中的大量编译器选择时,我不知道选择哪一个.现在你也知道了!请参阅编译x64代码时,"x86_amd64"和"amd64"之间的区别是什么?.
让我们有一些乐趣并编写一个64位程序,然后进行调试.一个好的测试是分配大量内存(典型的32位Windows进程限制为2GB,请参阅64位操作系统上32位进程可以访问多少内存?).例如,分配32GB的RAM应该是一个积极的指标,我们确实在编译64位应用程序.以下是QtCreator调试64位Windows测试程序的屏幕截图:
请注意,我正在使用上面提到的MSVC2017 64位编译器和CDB.exe调试器.
#include <QCoreApplication>
#include <cassert>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int intSize = sizeof(int);
assert(intSize == 4);
int intPtrSize = sizeof(int*);
assert(intPtrSize == 8);
constexpr size_t giga = 1000 * 1000 * 1000;
size_t _32gigs = 32 * giga / intSize;
int* gigaChunk = new int[_32gigs];
assert(gigaChunk != nullptr);
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14218 次 |
| 最近记录: |