安装时出现以下错误glib
。
ERROR:thread.c:147:test_thread4: assertion failed: (thread == NULL).
这是什么问题?我该如何解决?
答案1
请记住,make check
glib 排在最后。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。无论如何,线程管理库调用的错误返回值都会让我非常紧张。