【发布时间】:2015-04-14 18:51:36
【问题描述】:
我在预先配置的环境中从控制台使用 GDB,它提供的版本有一些错误。最烦人的是,有时在单步执行函数或添加断点或打印调用堆栈时,会喷出数百行类似的连续行:
warning: Range for type (null) has invalid bounds 0..-103
我能找到的关于这个问题的唯一参考是here,它没有帮助。
鉴于上述情况,我认为这应该很简单
指示 GDB 禁止此类警告 - 看起来像死路一条。据我所知,GDB 不允许用户隐藏此类警告。
通过 .gdbinit 在钩子中拦截它们 - 看起来很有希望。例如,我可以通过查看this answer 中引用的 .gdbinit 文件来更改终端颜色。不幸的是,我在the documentation 中找不到任何对我有用的钩子。
过滤警告(可能通过 stdout 和 GDB 之间的某种代理) - 感觉很老套,但我不介意这样做,如果它会以某种方式工作。一个愚蠢的尝试是将stderr重定向到
/dev/null,如下所示:gdb -p xxxxxx 2> /dev/null,但看起来警告实际上被推送到了stdout。真可惜。然后我还想,也许我可以做一些愚蠢的事情,比如像gdb -p xxxxxx | grep -v ^warning这样通过grep 过滤标准输出,但这似乎有不想要的副作用,即由于某种原因使终端提示不可见。
有人知道什么可行吗?我搜索了很多可以帮助我实现第三个想法的东西,但是到目前为止,我空手而归......
【问题讨论】:
-
只是一个理论:也许可以通过对二进制文件中的符号信息进行一些操作来避免错误。我知道有一些工具可以去除选定的符号。您的 gdb 似乎误解了某些数组类型。但我不知道该怎么做(无论如何它会降低调试器的功能)。
-
在我的情况下,这听起来比简单地获得更新版本的 GDB 更让人头疼……再说一次,确实,它是桌面上的另一个选择,但我想我会需要深入 GDB 的内部,从这些数组符号中找出它到底不喜欢什么。
-
如果你有一个 C 编译器,使用这个简单版本的 script 应该很容易,删除写入日志文件的部分,并添加代码以过滤掉你没有的任何行'不想看。
-
看起来我必须投入一些研究工作来调整它以满足我的需要......我仍然很惊讶 bash 没有提供一个简单的机制来实现我想要的。跨度>
标签: c linux debugging console gdb