为什么加载符号会使Visual Studio启动时间过长?

zdwk9cvp  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(152)

我有一个用c++编写的小Qt项目,当我调试它(发布)时,它需要像7~10sec一样启动,甚至将该高速缓存符号保存到本地文件夹中。
禁用此选项时:Debugging -> General -> [x] Load debug symbols in external process (Native only)
并选择此选项:Debugging -> Symbols -> (*) Load only specified modules
开始调试同一个项目大约需要1sec
我的电脑规格:

Windows 10
Visual Studio 2022
cpu: i9 9900k
ssd: 970 evo plus (gen3 around 2~3k read/write speed)

为什么时间差这么大?
我问是因为即使“禁用”我提到的选项,智能仍然工作。

调试时这些符号有什么用?

禁用这些选项是否会在调试时产生影响?

bmvo0sr5

bmvo0sr51#

在源代码被编译之后,* 大部分 * 变量的实际名称将被剥离以保存空间,因为可执行文件的实际机器码不使用变量的长字符串名称,它使用内存地址。
因此调试符号用于向调试器提供信息,而这些信息通常不会出现在最终的可执行文件中,例如您在源代码中提供的与各种内存地址相关联的名称。因此,如果发生错误,例如:

int* some_invalid_pointer = NULL;
// Segmentation fault should occur here
int some_variable = *some_invalid_pointer;

如果您没有启用调试符号,您可能会收到Error: Segmentation Fault之类的消息,因为调试器不知道每个变量的实际名称。调试符号为调试器提供了更多信息,以便它可以打印更接近Error: Segmentation Fault on Line 3: "int some variable = *some_invalid_pointer;"的消息,这样更容易调试。
所以它需要更长的时间,因为需要加载的可执行文件更大,而且调试并不像运行在调试模式下编译的代码版本那么简单。调试通常包括运行一个实际的单独的调试器可执行文件,然后它加载并运行您的代码。所以当调试时,您实际上需要加载并开始运行调试器,然后调试器加载您的程序。这是特别慢的,因为它可能是调试器加载它,而不是像正常的操作系统。
(To回答你的最后一个问题,是的,从技术上讲,调试信息可以留在一个发布的可执行文件中,但由于可执行文件通常是 * 按需分页 * 到内存中的(如果你感兴趣,你可以查找它),基本上它的意思是,一个可执行文件中的信息,从来没有实际引用,不应该加载到内存中,所以它不应该对发布运行时性能有影响)

相关问题