我有一个接受管道输入的程序:
bash> echo "something" | ./program 'seomthingelse'
如何在没有创建新文件的情况下将此输入重定向到gdb?
答案 0 :(得分:1)
如何在没有创建新文件的情况下将此输入重定向到gdb?
echo "something" | ./program 'seomthingelse'
启动它,并在它仍处于延迟状态时从另一个窗口附加它。第二个解决方案通常对于非常特别关于如何调用它们的程序非常有用,并且我发现以下实现很有效:
int main(int argc, char *argv[])
{
if (getenv("WAIT_FOR_GDB") != NULL) {
int done = 0;
while (!done) sleep(1);
}
/* rest of main */
}
然后在环境中设置WAIT_FOR_GDB
,并可以花费任意时间来附加进程。关联后,从up
,sleep
开始set var done = 1
,设置您需要的任何其他断点,并continue
。
答案 1 :(得分:1)
您可以使用gdbserver
。 stdin可以不加修改地提供给目标程序。
在一个终端会议中:
bash> echo "something" | gdbserver ./program 'seomthingelse'
Process ./program created; pid = 1591
Listening on port 1234
此时,./program
在启动后暂停了。
在另一个终端会议中:
bash> gdb ./program
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
Loaded symbols for /lib/ld-linux.so.2
0x48611020 in _start () from /lib/ld-linux.so.2
(gdb)
gdbserver
可能在您的发行版的gdb
包中,或者您可能需要安装另一个包。在Fedora上,它是gdb-gdbserver
。