Ошибка при запуске & ldquo; make check & rdquo; для glib-2.32.4

Я получаю следующую ошибку при установке glib.

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

В чем проблема и как я могу ее исправить?

1
задан 4 February 2018 в 14:30

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. В любом случае, неправильные значения возврата из вызовов библиотеки управления потоками заставили бы меня сильно нервничать.

0
ответ дан 4 February 2018 в 14:30

Другие вопросы по тегам:

Похожие вопросы: