我编译了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就足够了。我没有定制它。