我编译的C++项目,它不是太大,约6M二进制。当我调试它并想打印一些变量时,我输入前两个字符并按Tab键完成。然后gdb读取符号永远冻结。我怎么解决这个问题。谢谢!当打印变量与制表符完成时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的确切位置。
我的二进制文件是6MB的调试信息,我也认为这不是一个大项目。问题再次出现,即使没有按Tab键,我只是键入“打印一些变量”。终端说:“读取sdk/segment/cpcidskapmodel.cpp ...完成的符号”,冻结(我之前设置了详细信息)。我无法理解sdk/segment/cpcidskapmodel.cpp是什么,这不是我的项目文件。我的GDB版本是“GNU gdb(GDB)7.6.2”; – JunWangCas
更严重的是,我无法打断它,不得不杀死gdb进程。 – JunWangCas
@JunWangCas我已经更新了答案。 –
如果您可以将更新到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就足够了。我没有定制它。
- 1. golang gdb - 打印变量
- 2. 完成pthread后的打印变量
- 3. 转:使用gdb打印变量
- 4. 在GDB中打印多个变量?
- 5. 在GDB中打印装配体变量
- 6. gdb:打印一个不在当前范围内的变量
- 7. 打印的结构阵列变量的值在GDB
- 8. 如何使用GDB控制台打印链接变量?
- 9. 当试图单独打印变量时,Printf会输出错误的值,当将此变量与其他变量一起打印时,打印出正确的值
- 10. 结构变量打印
- 11. 当window.open触发打印onLoad时,父窗口冻结
- 12. gdb可以在每次中断时打印特定变量吗?
- 13. 在调试msp430时打印GDB中的变量值
- 14. 仅当变量发生变化时才打印变量?
- 15. 当搜索过快时自动完成冻结
- 16. 打印与另一变量
- 17. 打印在GDB
- 18. 当需要绘制时八度冻结
- 19. gdb如何实现结构化打印?
- 20. gdb - 如何打印C++评估结果
- 21. gdb中的打印结构元素
- 22. 打印变量
- 23. 打印变量
- 24. 当打开查询设计器时,报表生成器3.0冻结
- 25. 当使用自动完成字典以及当前文件时,Vim冻结
- 26. 如何使用gdb调试器打印结构成员的值?
- 27. C++在测试成员变量是否等于NULL时冻结。
- 28. 如何在GDB中打印#defined常量?
- 29. PDFBox冻结在打印()命令
- 30. 当使用multimap时表单冻结
可能重复的[大型二进制文件的制表符完成中断](http://stackoverflow.com/questions/597777/tab-completion-interrupt-for-large-binaries) –