gdb在选项卡完成的情况下打印变量时冻结



我编译了c++项目,它不是太大,大约是6M二进制。当我调试它并想打印一些变量时,我键入前两个字符,然后按Tab键完成。然后gdb读取的符号永远冻结。我该如何解决这个问题。非常感谢。

我键入前两个字符,然后按Tab键完成。然后gdb读取的符号永远冻结。我如何解决这个问题

医生,我那样做很疼。

好吧,不要那样做。

说真的,如果你有一个非常大的二进制文件(不清楚你的6MB大小是有调试信息还是没有调试信息),并且有很多变量,那么GDB必须花一些时间搜索与你的两个初始字符匹配的变量。

也就是说,

  • 我们经常调试大小为2GB或更大的二进制文件,并且
  • 已经花了相当多的精力来改进使用此类二进制文件的GDB体验

所以,也许你的第一步应该是使用最新版本的GDB,看看这个问题是否已经为你解决了。

更新:

我的二进制文件是6MB,带有调试信息

这根本不算大。当然,在这样的二进制文件中列出所有变量不应该导致超过几秒钟的延迟。

我的GDB版本是"GNU GDB(GDB)7.6.2">

这是最新版本。

得出GDB中存在漏洞的结论可能是安全的。

如果您可以构建一个显示问题的最小测试用例,那么您最好的选择是在http://sourceware.org/bugzilla.

如果不能,您将不得不自己调试GDB。一个合理的起点是运行strace -p <pid-of-hung-gdb>gdb -p <pid-of-hung-gdb>; (gdb) where,以查明GDB的确切位置。

如果您可以更新到GDB 7.10,您的选项卡完成冻结应该会消失。

GDB 7.10(截至2015年8月)包含一个解决此问题的功能。

设置最大完成数

设置在完成默认值为200。此限制允许GDB避免生成大的完成列表,其计算可能导致调试器暂时没有响应。

[以上引用来自gitweb站点上显示的gdb]的补丁

GDB新闻稿将这一功能列为:"在完成过程中考虑的候选人数量现在可以受到限制。">

更新到GDB 7.10解决了我的问题。最大完成次数的默认值200就足够了。我没有定制它。

相关内容

最新更新