对 glib-2.32.4 运行“make check”时出错

对 glib-2.32.4 运行“make check”时出错

安装时出现以下错误glib

ERROR:thread.c:147:test_thread4: assertion failed: (thread == NULL).

这是什么问题?我该如何解决?

答案1

请记住,make checkglib 排在最后。make check依赖于desktop-file-utils-0.20,而后者又依赖于已安装的 glib,因此在运行之前,应确保desktop-file-utils 已安装、可以正常工作且版本正确make check。规范的方法是先安装新的 glibc,然后安装desktop-file-utils,最后执行make check

一般来说,检查过程中出现错误是值得担心的,至少在专业环境中是如此。测试失败可能意味着某些特定情况可能导致系统崩溃,即使系统 99.99% 的时间运行良好。

对于这种特殊情况,你可以直接查看 glib 的源代码来了解发生了什么。以下是相关函数:

/* test that thread creation fails as expected,
 * by setting RLIMIT_NPROC ridiculously low
 */
static void
test_thread4 (void)
{
#ifdef HAVE_PRLIMIT
  struct rlimit ol, nl;
  GThread *thread;
  GError *error;
  gint ret;

  getrlimit (RLIMIT_NPROC, &nl);
  nl.rlim_cur = 1;

  if ((ret = prlimit (getpid(), RLIMIT_NPROC, &nl, &ol)) != 0)
    g_error ("prlimit failed: %s\n", g_strerror (ret));

  error = NULL;
  thread = g_thread_try_new ("a", thread1_func, NULL, &error);
  g_assert (thread == NULL);
  g_assert_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN);
  g_error_free (error);

  if ((ret = prlimit (getpid (), RLIMIT_NPROC, &ol, NULL)) != 0)
    g_error ("resetting RLIMIT_NPROC failed: %s\n", g_strerror (ret));
#endif
}

错误发生在以下行

g_assert( thread == NULL ) ;

测试函数将 RLIMIT_PROC 的值更改为 1(nl.rlim_cur=1,限制当前进程可以拥有的线程数)。使用该设置,创建新线程(g_thread_try_new()调用)应该会失败并返回NULL。出于某种原因,这种情况并没有发生。

要么是测试套件中存在错误,要么是 glibc 存在问题,要么是无法正确构建 glibc。无论如何,线程管理库调用的错误返回值都会让我非常紧张。

相关内容