我想调试一个由我的程序调用的共享库。共享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。
答案 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完全缓冲此类输出。)