我正在调试一些代码,当我单步执行一个线程时,我从另一个线程向STDERR打印了大量的超时错误消息。我想隐藏打印到stderr的所有内容。我在启动应用程序时尝试使用重定向:
(gdb) run 2> /dev/null
但这似乎也重定向stdout,我需要在逐步执行代码时调用我的对象上的漂亮打印函数。
PS我正在使用GDB 7.2,而且我无法升级:(
PPS我不认为这会依赖于shell,但我正在运行tcsh 6.17
答案 0 :(得分:4)
尝试设置args'命令:
(gdb) set args 2>/dev/null
(gdb) run
答案 1 :(得分:1)
[编辑: @ invalid-entry'答案是正确的。至少使用适当的最新gdb,您可以在set args
或run
命令上执行per-fd重定向。我不确定gdb究竟何时学会了如何做到这一点。如果它不适合您,则以下解决方案可能仍然有用。]
我不认为通过但是,可能> em>使用gdb手动将劣质的stderr流重定向到文件。run
命令识别的普通shell重定向可以做到这一点。
像
这样的东西# 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
符号; main
可能会改为工作。
答案 2 :(得分:0)
在我的情况下,根本原因是使用tcsh。它没有任何方法来重定向stderr,并且gdb显然将这些重定向字符串传递给shell来解释。有hacks to work around this at the command-line,但我无法让他们在GDB内部工作。如果你使用一个理智的shell,那么invalid entry's approach就可以了。我当时没有机会测试the paul's suggestion因为我离开那个项目,但它可能适用于tcsh。如果有人确认它有效,我会更改所选答案。