使用制表符完成打印变量时gdb冻结

时间:2014-01-05 13:12:08

标签: c++ debugging gdb

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

2 个答案:

答案 0 :(得分:2)

  

我键入前两个字符,然后按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的确切位置。

答案 1 :(得分:1)

如果您更新为GDB 7.10 ,则标签完成冻结应该会消失。

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

  

设置max-completions

     

设定期间要考虑的最大候选人数   完成。默认值为200.此限制允许GDB避免   生成大型完成列表,其计算可能导致   调试器暂时没有响应。

[以上引用取自the patch shown on the gitweb site for gdb]

The GDB news release将该功能列为:“现在可以限制在完成期间考虑的候选人数量。”

更新到GDB 7.10解决了我的问题。 max-completions的默认值200就足够了。我没有自定义它。