为啥 gdb 在 Windows 中这么慢?

Posted

技术标签:

【中文标题】为啥 gdb 在 Windows 中这么慢?【英文标题】:Why is gdb so slow in Windows?为什么 gdb 在 Windows 中这么慢? 【发布时间】:2014-12-09 13:46:36 【问题描述】:

我最近注意到在 Windows 中运行 gdb 内的程序会使其速度变慢,我想知道为什么。

这是一个例子:

纯C++03项目,使用mingw32编译(gcc 4.8.1,32位)。 它与 libstdc++ 和 libgcc 静态链接,没有使用其他库。 这是一个 CPU 和内存密集型非并行进程(网格编辑操作、大量新闻和删除以及对所涉及的数据结构的查询)。 问题不在于启动时间,整个过程非常缓慢。 调试构建 (-O0 -g2) 在 gdb 外部运行 8 秒,但在 gdb 内部运行 140 秒。 从命令行测试,只需启动 gdb 并输入“run”(未定义断点)。 我还测试了一个发布版本(优化,并且没有调试信息),它在 gdb 中仍然慢得多(3 秒对 140 秒;是的,它与 gdb 中未优化的版本所用的时间相同)。 使用 mingw32 项目中的 gdb 7.5 和 7.6 以及我编译的 gdb 7.8 进行测试(所有这些均不支持 python)。 我通常在 GNU/Linux 机器上进行开发,我无法注意到使用或不使用 gdb 运行之间的速度差异。

我想知道 gdb 做了什么让它运行如此缓慢。我对调试器的工作原理有一些基本了解,但我不知道它在这里做什么,而且这次谷歌搜索对我没有帮助。

【问题讨论】:

一些额外信息:我刚刚用 gprof 分析了应用程序,有和没有 gdb,结果非常相似,额外的时间似乎不存在。我也用-pg编译过gdb,但目前还没有发现什么奇怪的东西。 出于好奇,您是否尝试过使用不同的 Windows 调试器(如 ollydbg、VS 集成调试器、windbg 等)运行它?它们的运行时性能与 mingw-gdb 相比如何? 【参考方案1】:

我终于找到了问题所在,感谢greatwolf让我测试其他调试器。 Ollydbg 与 gdb 花费相同的时间,所以这不是 gdb 问题,而是 Windows 问题。这个技巧改变了我的搜索条件,然后我发现这篇文章*很好地解释了这个问题并提供了一个非常简单的解决方案:将环境变量 _NO_DEBUG_HEAP 定义为 1。这将禁用 windows 提供的特殊堆和 c++程序使用。

* 这是链接:http://preshing.com/20110717/the-windows-heap-is-slow-when-launched-from-the-debugger/

【讨论】:

这在我的 MSYS2 的 64 位 GCC 编译器 + GDB 下工作,它使调试会话非常快,谢谢!【参考方案2】:

我曾经遇到过 gdb 非常慢的问题,我记得禁用 nls(本地语言支持,即所有消息的翻译)可以解决这个问题。

配置时间选项是--disable-nls。我可能只是误认为真正的原因是什么,但无论如何你都值得一试。

我当时的错误报告是here,尽管结论是我弄错了。如果您能对此提供进一步的见解,那就太好了!

【讨论】:

我自己编译了最新的gdb版本(7.8.1),有没有那个选项,没有区别。之前读过,但我觉得和加载巨大的共享库(比如qt)有关。 @Zaskar 虽然Qt 部分可能是真的,但我在 Debian 和 Win10 系统上都使用它。在 Debian 上加载速度更快(包括所有与 Debian 相关的库),而在 Win10 上加载大量其他与 Windows 相关的库,这可能需要调试会话期间加载时间的 2/3。

以上是关于为啥 gdb 在 Windows 中这么慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥python在windows上这么慢?

为啥带有 SourceTree 的 WSL2 上的 Git 对我来说这么慢?

为啥这个交叉连接在 Linq 中这么慢?

为啥 Collections.counter 这么慢?

为啥 putImageData 这么慢?

为啥在 Chrome 上的 for 循环中使用 let 这么慢?