我正在调试一个C程序(我没写过)。我启用了所有内部调试工具(一大堆printf),我编写了一个使用proc_open()的小PHP脚本,只抓取stdout和stderr,并将它们在一个文件中进行时间坐标。
目前,二进制文件正在死于一个由glibc捕获的realloc()错误,并且打印了一个glibc backtrace,从以下开始:
*** glibc detected *** /sbin/rsyslogd: realloc(): invalid next size: 0x00002ace626ac910 ***
这是我不明白的事情:我已经确认PHP脚本正在从二进制文件的进程中捕获stdout和stderr并将它们写入正确的文件,但是这个回溯仍然打印到控制台。这是从哪里来的?除了stdout和stderr之外还有一些神奇的输出通道吗?
关于如何将此回溯捕获到文件或使用stderr发送出去的任何想法?
谢谢, 杰森
答案 0 :(得分:13)
对不起......我在大约半小时的谷歌搜索后问了这个问题,但经过一番调查后,我找到了一个解决方案...在Fedora邮件列表帖子(http://www.redhat.com/archives/rhl-devel-list/2009-August/msg00982.html)处理这个问题在Koji构建系统......
export LIBC_FATAL_STDERR_=1
显然,默认情况下,错误报告由于某种原因直接转到/ dev / tty ...
答案 1 :(得分:0)
Jason引用的邮件列表也提出了一些更重要的解决方案,如下所示:
IMHO koji(并且就此问题而言)应该在内部运行构建 一个俘虏pty,无论如何都会记录其输出,即使它们重定向 一切。你永远不会知道一些包将要尝试的疯狂废话。 (Roland McGrath,http://www.redhat.com/archives/rhl-devel-list/2009-August/msg00982.html)
以下帖子建议使用pty
python包来完成此任务。