【问题标题】:Altering / Filtering GDB output in console mode在控制台模式下更改/过滤 GDB 输出
【发布时间】:2015-04-14 18:51:36
【问题描述】:

我在预先配置的环境中从控制台使用 GDB,它提供的版本有一些错误。最烦人的是,有时在单步执行函数或添加断点或打印调用堆栈时,会喷出数百行类似的连续行:

warning: Range for type (null) has invalid bounds 0..-103

我能找到的关于这个问题的唯一参考是here,它没有帮助。

鉴于上述情况,我认为这应该很简单

  1. 指示 GDB 禁止此类警告 - 看起来像死路一条。据我所知,GDB 不允许用户隐藏此类警告。

  2. 通过 .gdbinit 在钩子中拦截它们 - 看起来很有希望。例如,我可以通过查看this answer 中引用的 .gdbinit 文件来更改终端颜色。不幸的是,我在the documentation 中找不到任何对我有用的钩子。

  3. 过滤警告(可能通过 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


【解决方案1】:

首先,gdb 无法过滤警告。警告机制不能从 CLI 或 Python 层编程。

升级 gdb 可能会有所帮助,但可能不会。根据我对您提供的链接的阅读,听起来问题与 Fortran 可变长度数组(“VLA”)有关。最后我听说这个功能仍在 gdb 中工作。值得一试,但我不会指望它。

如果警告不会干扰您的工作,您可以简单地破解 gdb 来删除警告。这应该很简单——比下一个想法更简单。

如果你真的想要一个包装器来消除警告,要么(1)在 emacs 中运行 gdb 并在一些 elisp 中破解以删除这些消息;或 (2) 使用 expect 将 gdb 命令行包装在删除警告的内容中。

【讨论】:

  • 虽然破解 GDB 并删除愚蠢的警告会很有吸引力,但它是最不便携的事情,它还涉及构建 GDB...您建议利用 emacsexpect 听起来很有希望,我可能会试一试,但我希望有一个更简单的解决方案,比如一些充当 GDB 透明包装器的 bash 脚本。感觉这应该很容易做到,但是,不知何故,我似乎找不到任何有用的例子......
  • 这取决于你,但 IMO grep 警告并破解它比编写这个包装器要简单很多倍。 gdb 没有很多依赖项。也就是说,您可以尝试使用 MI 的现有 gdb 包装器,例如 cgdb。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多