Почему моя сборка gulp/teamcity завершается с ошибкой Assertion failed: 0, файл src\uv-common.c, строка 103?

Моя сборка TeamCity случайно дает сбой со следующим сообщением:

[16:25:45][Step 1/2] [16:25:45] Build complete!
[16:25:45][Step 1/2] [16:25:45] Finished 'build' after 3.32 min
[16:25:45][Step 1/2] [16:25:45] Starting 'test'...
[16:25:48][Step 1/2] Assertion failed: 0, file src\uv-common.c, line 103
[16:25:48][Step 1/2] Process exited with code 3
[16:25:48][Step 1/2] Step Gulp (Command Line) failed

Некоторые детали:

  1. Я использую средство командной строки: call npm install; вызов глоток ci
  2. Рассматриваемый шаг запускает NUnit на моих скомпилированных тестовых двоичных файлах.
  3. Я не могу воспроизвести проблему через командную строку.

Информация об окружающей среде:

  • TeamCity v9.0.2 (последняя на момент написания)
  • Node v10.36 (последняя на момент написания)
  • Gulp v3.8.10 (последняя на момент написания)
  • Пакет Nuget NUnit.Runners 2.6.4 (последний на момент написания)

person Josh Kodroff    schedule 02.02.2015    source источник


Ответы (2)


Как указал Майкл, это связано с сетевой библиотекой libuv.

Есть много шансов, что ваша ошибка исходит из кода EHOSTDOWN, который не обрабатывается библиотекой, и приведет к сбою вашего процесса.

На самом деле есть несколько проблем либо с репозиторием Joyent, либо с libuv one об этом.

Похоже, что эта фиксация исправлена ​​и теперь работает с версией 0.12.1 Узел.

person Balthazar    schedule 24.03.2015
comment
О, классно! Как раз вовремя :) - person Balthazar; 25.03.2015

Этим все сказано, верно?

Assertion failed: 0, file src\uv-common.c, line 103
Process exited with code 3

Кто-то установил утверждение для отладки. Строка 103 фактически включает это утверждение. Я предполагаю, что ноль здесь является рассматриваемым значением, которое было проверено.

 98 #define UV_ERR_NAME_GEN(name, _) case UV_ ## name: return #name; 
 99 const char* uv_err_name(int err) { 
100   switch (err) { 
101     UV_ERRNO_MAP(UV_ERR_NAME_GEN) 
102     default: 
103       assert(0); // <- Here's the assertion that failed
104       return NULL; 
105   } 
106 } 
107 #undef UV_ERR_NAME_GEN 

Есть действующая линия на две выше, чем ваше утверждение. Он хочет поймать ошибку, как она видна, сопоставив ее с чем-то известным. Это «по умолчанию:» означает, что это неизвестная ошибка, о которой автор не знает. Таким образом, утверждение должно умереть вот так, поскольку он не знал, как лучше с ним справиться.

Итак, что такое либув? Это сетевая библиотека. Все зависит от того, что вы делали, когда вызывался вызов uv_err_name(something). Например, это мог быть вызов getaddrinfo(). Базовый стек tcp должен возвращать распознаваемые номера ошибок. Очевидно, ваша версия не распознала то, что было возвращено из стека tcp.

Итак, теперь, когда мы разумно понимаем проблему, я настоятельно рекомендую обновить связанные с ней библиотеки libuv. Повторите тест. Если это снова не удастся, убедитесь, что вы подключены к Ethernet (что-то, если вы используете Wi-Fi, который можно отключить).

person Michael Blankenship    schedule 22.03.2015
comment
В каталоге вашего проекта вы можете увидеть, какие версии libuv встроены в ваши существующие модули: findstr /S /I /C:\libuv\: package.json - person Michael Blankenship; 23.03.2015
comment
Спасибо за подробный ответ, но я искал что-то на более высоком уровне абстракции, например, в чем проблема? на уровне глотка или выше. - person Josh Kodroff; 23.03.2015
comment
Проблема может быть не в вашем коде. Вы полагаетесь на основу кода с открытым исходным кодом, чтобы быть хорошо построенным. Если вы прочитаете комментарии в области libuv, вы увидите, что другие жаловались на эту и подобные ошибки. Затем автор libuv решает эти проблемы в обновленных версиях. Моя интуиция подсказывает мне, что проблема заключается в шаге поиска DNS, когда, например, он пытается получить IP-адрес из предоставленного имени хоста. Обходной путь может состоять в том, чтобы сделать запись в вашем файле HOSTS локально, чтобы обмануть шаг DNS. Предположительно хостом является github.com. - person Michael Blankenship; 24.03.2015