如何让 GDB 显示每行输出的时间戳?

问题描述 投票:0回答:2

我正在调试一个不为其输出添加时间戳的应用程序。 GDB 可以做到这一点吗?如果不能的话,我如何在不修改源代码中的每个 printf 的情况下为所有消息添加时间戳(我的应用程序是用 c++ 编写的)?

到目前为止,我得到的最好的结果是在 shell 上运行它,将输出流式传输到 awk,然后将 GDB 附加到程序进行调试。不过,我更喜欢 GDB 内部的某种方式。

c++ gdb
2个回答
2
投票

GDB可以这样做吗

不容易(如果有的话):GDB不会捕获程序的输出,它只是赋予它对终端的控制权,并且程序可以自由地打印它想要的任何内容。

到目前为止,我得到的最好的结果是在 shell 上运行它,将输出流式传输到 awk,然后将 GDB 附加到程序进行调试。不过,我更喜欢 GDB 内部的某种方式。

您应该能够在 GDB 中进行 awk 重定向:

(gdb) run | awk ...

但请注意,此管道不应该工作(在 GDB 内部或外部):默认情况下,应用程序应检测到其输出将进入管道,并开始在

stdout
上进行完全缓冲(
stderr
应保留无缓冲)。

为了防止缓冲,您可以调用

setvbuf

另一种解决方案(对于无法修改应用程序的情况)是使用

expect
unbuffer
,如这个答案


0
投票

这可以使用

set debug timestamp

设置调试时间戳 打开或关闭带有 GDB 调试信息的时间戳显示。启用后,每条调试消息之前都会显示秒和微秒。

https://sourceware.org/gdb/current/onlinedocs/gdb.html/Debugging-Output.html

© www.soinside.com 2019 - 2024. All rights reserved.