我正在调试一个没有给它输出时间戳的应用程序。 GDB可以做到这一点,如果没有,我怎么可能为所有消息添加时间戳,没有修改源中的每个printf(我的应用程序是用c ++)?
我到目前为止最好的是在shell上运行它,将输出流式传输到awk,然后将GDB附加到程序进行调试。不过,我更喜欢GDB内部的一些方式。
答案 0 :(得分:1)
GDB可以这样做吗
不容易(如果有的话):GDB不捕获程序的输出,它只是让它控制终端,程序可以随意打印它想要的任何内容。
我到目前为止最好的是在shell上运行它,将输出流式传输到awk,然后将GDB附加到程序进行调试。不过我更喜欢GDB内部的一些方式。
你应该能够在GDB中进行awk重定向:
(gdb) run | awk ...
但是请注意,此管道不应该工作(在GDB内部或外部):默认情况下,应用程序应检测到其输出是否发送到管道,并开始在stdout
上执行完全缓冲({ {1}}应保持无缓冲状态。
为防止缓冲,您可以拨打stderr
。
替代解决方案(对于无法修改应用程序的情况),使用setvbuf
或expect
,如this answer。