【问题标题】:Why would call to __kernel_vsyscall() from write() never return?为什么从 write() 调用 __kernel_vsyscall() 永远不会返回?
【发布时间】:2012-05-03 22:54:30
【问题描述】:

我的 C++ 程序挂起,我将它附加到调试器并找到此堆栈跟踪,第 0 帧永远不会完成。这里出现问题的可能问题是什么?如果我可以收集更多信息,我仍然可以在调试器中使用它。还有其他线程。

#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.
}

代码正在尝试打印堆栈跟踪。

【问题讨论】:

  • write(2) 可以出于多种原因进行阻止。它可能正在写入已满的管道。它可能正在写入具有大量未确认数据的套接字。它可能正在写入已发出CTRL-S 的终端。您能告诉我们cout 的地址吗?
  • 终端位于另一个 C++ 应用程序中,因此无法向其键入 CTRL-S。我可以在调试器中做更多的事情吗?

标签: c++ variadic-functions cout hung


【解决方案1】:

如果通过 ssh 调用其父进程并且启动它的 ssh 连接已退出,则问题似乎是 fork()ed 子进程没有有效的 cout。

解决方法是在召唤过程退出后停止使用 cout。 clog 工作正常,因为它会转到由 fork()ed 子进程设置的日志文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-12
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多