在一个调试 session 期间使用 GDB 进行调试时,它会随着时间的推移变得越来越慢。即使是最简单的操作,比如跨步和步入,也可能需要几十秒,有时甚至几分钟。
我正在调试一个相当大的项目(Chromium 浏览器)。我能想到的唯一原因是 gdb 随着时间的推移变得越来越慢,因为它加载了越来越多的符号,并且使用它们需要更长的时间。然而,Chromium 将整个代码编译成一个巨大的可执行文件,其中包含应该在一开始就加载的所有符号。因此符号数据库在调试期间不会增长。此外,为什么需要查找符号来执行单步执行或单步执行?
在测试时,我尝试在前端(Eclipse、QtCreator、Emacs)和命令行中使用 gdb,以确认这不是 IDE 问题。两个用例都展示了相同的问题,但是它似乎在 IDE 中开始出现得更快(可能是因为 IDE 还加载了监视 View 、调用堆栈、线程列表等的符号)。
为什么 GDB 越来越慢?它是设计缺陷、错误还是我的计算机中的某些特定问题?是否有任何免费的 GDB 替代品可以更快地工作?
最佳答案
这是一个错误。尝试更新版本的 GDB(最好是当前的 CVS 快照)。如果问题仍然存在,请使用 repro 说明将其报告给 GDB bugzilla。
GDB 在启动时加载部分符号 ( psymbols
),并“按需”读取更多内容,因此预计会有一些增长。
为了跳过或进入,GDB 可能需要当前翻译单元 (TU) 的行表。如果您的“步入”操作将您带到一个新的 TU,则必须加载新的行表。
尽管如此,GDB 不应该在 step
或 next
附近花费几分钟的时间。
关于performance - 随着时间的推移,GDB 变得越来越慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8484002/