gdb:如何将共享库的日志文件重定向到 gdb 输出

gdb: How to redirect the log-file of shared lib to gdb output

本文关键字:gdb 日志 文件 重定向 输出 共享      更新时间:2023-10-16

我想调试一个由我的程序调用的共享库。共享库输出到单独的日志文件:shared-lib.log。我想将库的输出重定向到 gdb(我想将输出重定向到运行 GDB 的同一终端)。我尝试了以下方法:

(gdb) run myprogram shared-lib.log>1
(gdb) run myprogram shared-lib.log>/dev/stdout
(gdb) run myprogram /dev/stdout

但这不起作用,完整的路径名/var/log/shared-lib.log 也是如此。

共享库输出到单独的日志文件:shared-lib.log。

如果您有该库的源,则可以对其进行修改以执行此操作。如果你不这样做,你应该让它的开发人员知道你不欣赏他们选择的日志记录(提供一种方法将库输出重定向到某个地方是可以的,但坚持这样做而不让你自己决定是不行的)。

我想将库的输出重定向到 gdb。

大概您希望将该输出重定向到运行 GDB 的同一终端,以便您可以在单步执行程序时看到库输出的外观。

您可以尝试将此操作作为第一步:

rm -f shared-lib.log && ln -s /dev/tty shared-lib.log

如果库只是open("shared-lib.log", O_WRONLY|O_CREAT, ...),那么这应该就足够了。但是,如果库首先执行unlink("shared-lib.log"),则不起作用。

在这种情况下,并非一切都会丢失,但会变得更加困难。您可能希望找出库正在写入哪个文件描述符(在 Linux 上,ls -l /proc/<pid-of-inferior>/fd应该告诉您)。您还希望安排一个开放的fd2/dev/tty。最后,您需要调用dup2($fd, $fd2)将库输出重定向到终端。您可能还需要在程序中fflush(NULL),否则库可能会完全缓冲其调试输出(因为它认为其输出将转到文件,并且 stdio 默认完全缓冲此类输出)。