2014-01-05 43 views
4

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

+0

可能重复的[大型二进制文件的制表符完成中断](http://stackoverflow.com/questions/597777/tab-completion-interrupt-for-large-binaries) –

回答

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的确切位置。

+0

我的二进制文件是6MB的调试信息,我也认为这不是一个大项目。问题再次出现,即使没有按Tab键,我只是键入“打印一些变量”。终端说:“读取sdk/segment/cpcidskapmodel.cpp ...完成的符号”,冻结(我之前设置了详细信息)。我无法理解sdk/segment/cpcidskapmodel.cpp是什么,这不是我的项目文件。我的GDB版本是“GNU gdb(GDB)7.6.2”; – JunWangCas

+0

更严重的是,我无法打断它,不得不杀死gdb进程。 – JunWangCas

+0

@JunWangCas我已经更新了答案。 –

1

如果您可以将更新到GDB 7.10,您的制表符完成冻结应该消失。

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

设置最大完井

设置 完成时要考虑候选人的最大数量。缺省值是200.此限制允许GDB避免 生成大型完成列表,其计算可能导致 调试器暂时无响应。

The GDB news release列出了特征[以上报价从the patch shown on the gitweb site for gdb取]为:“完成期间要考虑的候选的数量现在可以被限制。”

更新到GDB 7.10解决了我的问题。最大完成的缺省值是200就足够了。我没有定制它。