Я получаю следующую ошибку при установке glib
.
ERROR:thread.c:147:test_thread4: assertion failed: (thread == NULL).
В чем проблема и как я могу ее исправить?
Помните, что 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. В любом случае, неправильные значения возврата из вызовов библиотеки управления потоками заставили бы меня сильно нервничать.