在控制台模式下更改/过滤 GDB 输出

Altering / Filtering GDB output in console mode

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

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

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

鉴于以上情况,我认为两者都应该很简单

  1. 指示 GDB 抑制此类警告 - 看起来像死胡同。据我所知,GDB 不允许用户抑制此类警告。

  2. 通过 .gdbinit 在钩子中拦截它们 - 看起来很有希望。我能够更改终端颜色,例如,通过浏览 this answer. Unfortunately, I couldn't find any hook in the documentation 中引用的 .gdbinit 文件,这对我的目的很有用。

  3. 过滤警告(可能通过 stdout 和 GDB 之间的某种代理)- 感觉有点老套,但我不介意这样做,如果它能以某种方式工作的话。一个愚蠢的尝试是像这样将 stderr 重定向到 /dev/nullgdb -p xxxxxx 2> /dev/null,但看起来警告实际上被推送到了 stdout。无赖。然后我还想也许我可以做一些愚蠢的事情,比如像这样通过 grep 过滤 stdout gdb -p xxxxxx | grep -v ^warning,但这似乎有副作用,因为某些原因使终端提示不可见。

有人知道什么可行吗?我搜索了很多可以帮助我实现第三个想法的东西,但是,到目前为止,我空手而归...

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

升级 gdb 可能有帮助——但也可能没有帮助。根据我对您提供的 link 的阅读,听起来问题与 Fortran 可变长度数组 ("VLA") 有关。最后我听说这个特性仍在 gdb 中开发。值得一试,但我不会指望它。

如果警告不影响您的工作,您可以简单地破解 gdb 以删除警告。这应该非常简单——比下一个想法更简单。

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