2016-05-30 101 views
0

我想调试由我的程序调用的共享库。共享库输出到一个单独的日志文件:shared-lib.log。我想将lib的输出重定向到gdb(我想将输出重定向到GDB运行的同一终端)。我试过如下: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

“将lib的输出重定向到gdb”是什么意思?你想用它作为gdb的命令行输入吗?你有没有尝试过把'shared-lib.log'作为fifo,然后用其他工具读取fifo,比如'cat','tee',甚至shell的重定向? – Paulo1205

回答

1

共享库输出到一个单独的日志文件: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完全缓冲此类输出)。

+0

谢谢,第一步没有奏效,但它很聪明。第二步在我的情况下不起作用,因为我没有得到合理的文件描述符。有很多,我没有链接到lib。 我有源代码。所以我必须做老员工。谢谢你很好的答案。 – musbach