我的C++程序挂起,我将其附加到调试器并找到此堆栈跟踪,零帧永远不会完成。 这里可能出现的问题是什么?如果可以收集更多信息,我仍然在调试器中保留它。还有其他线程。
#0 0xffffe410 in __kernel_vsyscall ()
#1 0x0083929b in write () from /lib/libc.so.6
#2 0x007d9cd4 in _IO_new_file_write () from /lib/libc.so.6
#3 0x007d9995 in new_do_write () from /lib/libc.so.6
#4 0x007d9c7f in _IO_new_do_write () from /lib/libc.so.6
#5 0x007da56e in _IO_new_file_overflow () from /lib/libc.so.6
#6 0x007d9b6c in _IO_new_file_xsputn () from /lib/libc.so.6
#7 0x007d012f in fwrite () from /lib/libc.so.6
#8 0x009a96f6 in ?? () from /usr/lib/libstdc++.so.6
#9 0x009ac66b in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) () from /usr/lib/libstdc++.so.6
#10 0x0822aa2c in printErrorMsg (format=0x848675f "#%2i %s: %s(...) %s [%p]n") at myAssert.cpp:66
帧 10 的源代码是:
void
printErrorMsg(const char *format, ...)
{
va_list ap;
const int size = 4096;
char buffer[size];
va_start(ap, format);
vsnprintf(buffer, size, format, ap);
va_end(ap);
std::clog << buffer;
std::cout << buffer; // Code is hung here in frame 10.
}
代码正在尝试打印堆栈跟踪。
问题似乎是,如果 fork()ed 子进程的父进程是通过 ssh 调用的,并且启动它的 ssh 连接已退出,则 fork() 子进程没有有效的 cout。
解决方案是在召唤过程退出后停止使用 cout。 堵塞工作正常,因为它将进入由 fork() ed子进程设置的日志文件。