你能用tcsh作为外壳在GDB中重定向stderr吗



我正在调试一些代码,当我遍历一个线程时,我会从另一个线程收到大量超时错误消息打印到STDERR。我想隐藏打印到stderr的所有内容。我尝试在启动应用程序时使用重定向:

(gdb) run 2> /dev/null

但这似乎也重定向了stdout,我需要它来在遍历代码时对对象调用漂亮的print函数。

PS我正在使用GDB 7.2,不,我不能升级:(

PPS我不认为这会依赖于shell,但我正在运行tcsh 6.17

尝试"set args"命令:

(gdb) set args 2>/dev/null
(gdb) run

[Edit:@invalid entry的答案是正确的。至少有了一个合适的最新gdb,你可以在set argsrun命令上执行每fd重定向。我不确定gdb是什么时候学会的。如果它对你不起作用,下面的解决方案可能仍然有用。]

我认为run命令识别的普通shell重定向没有办法做到这一点但是,可以使用gdb手动将下级的stderr流重定向到文件。

类似的东西

# get the program started
break __libc_start_main
run
# open a new filehandle to /dev/null. the 1 is the value of the
# O_WRONLY constant, cause we want to open /dev/null in write mode.
set $nullfd = open("/dev/null", 1)
# make fd 2 (stderr) be a copy of that new handle
call dup2($nullfd, 2)
# we can close the new handle now (optional)
call close($nullfd)
# let the program carry on
cont

会完成这项工作,覆盖过去在fd 2打开的任何东西(以前可能是终端的句柄。(之后,对stderr的任何写入都将转到/dev/null

显然,这可能需要根据您的平台进行调整。您的可执行文件中可能没有__libc_start_main符号;CCD_ 6可能起作用。

在我的案例中,根本原因是使用了tcsh。它没有任何方法只重定向stderr,而且gdb显然正在将这些重定向字符串传递给shell进行解释。在命令行中有一些技巧可以解决这个问题,但我无法让它们在GDB中工作。如果您使用一个健全的shell,那么无效条目的方法就会起作用。我从来没有机会测试保罗的建议,因为那时我已经离开了那个项目,但它可能适用于tcsh。如果有人确认它有效,我会更改选定的答案。

最新更新