我编译的c ++项目不是太大,大约是6M二进制文件。当我调试它并想要打印一些变量时,我输入前两个字符并按Tab键完成。然后gdb读取符号永远冻结。我怎么解决这个问题。谢谢!
答案 0 :(得分:2)
医生,我这样做会很疼。我键入前两个字符,然后按Tab键完成。然后gdb读取符号永远冻结。我该如何解决这个问题
好吧,不要那样做。
说真的,如果你有一个非常大的二进制文件(不清楚你的6MB是否带有调试信息或没有调试信息的大小)和许多变量,那么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就足够了。我没有自定义它。