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

时间:2016-05-30 19:54:00

标签: c++ gdb

我想调试一个由我的程序调用的共享库。共享lib输出到单独的日志文件:shared-lib.log。我想将lib的输出重定向到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。

1 个答案:

答案 0 :(得分:1)

  

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

如果您拥有该库的来源,则可以将其修改为而不是这样做。如果你不这样做,你应该让它的开发者知道你并不欣赏他们选择的日志记录(可以提供一种方法来重定向某个地方的库输出,但它并不是好的,坚持这样做而不让你自己决定。)

  

我想将lib的输出重定向到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完全缓冲此类输出。)