使用gdb与管道输入而不创建文件

时间:2014-02-16 17:44:47

标签: gdb

我有一个接受管道输入的程序:

bash> echo "something" | ./program 'seomthingelse'

如何在没有创建新文件的情况下将此输入重定向到gdb?

2 个答案:

答案 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,并可以花费任意时间来附加进程。关联后,从upsleep开始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