我正在调试一个不为其输出添加时间戳的应用程序。 GDB 可以做到这一点吗?如果不能的话,我如何在不修改源代码中的每个 printf 的情况下为所有消息添加时间戳(我的应用程序是用 c++ 编写的)?
到目前为止,我得到的最好的结果是在 shell 上运行它,将输出流式传输到 awk,然后将 GDB 附加到程序进行调试。不过,我更喜欢 GDB 内部的某种方式。
GDB可以这样做吗
不容易(如果有的话):GDB不会捕获程序的输出,它只是赋予它对终端的控制权,并且程序可以自由地打印它想要的任何内容。
到目前为止,我得到的最好的结果是在 shell 上运行它,将输出流式传输到 awk,然后将 GDB 附加到程序进行调试。不过,我更喜欢 GDB 内部的某种方式。
您应该能够在 GDB 中进行 awk 重定向:
(gdb) run | awk ...
但请注意,此管道不应该工作(在 GDB 内部或外部):默认情况下,应用程序应检测到其输出将进入管道,并开始在
stdout
上进行完全缓冲(stderr
应保留无缓冲)。
为了防止缓冲,您可以调用
setvbuf
。
另一种解决方案(对于无法修改应用程序的情况)是使用
expect
或 unbuffer
,如这个答案。
这可以使用
set debug timestamp
设置调试时间戳 打开或关闭带有 GDB 调试信息的时间戳显示。启用后,每条调试消息之前都会显示秒和微秒。
https://sourceware.org/gdb/current/onlinedocs/gdb.html/Debugging-Output.html