为什么我的 gulp/teamcity 构建失败并显示 "Assertion failed: 0, file src\uv-common.c, line 103"?
Why does my gulp/teamcity build fail with "Assertion failed: 0, file src\uv-common.c, line 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
一些细节:
- 我正在使用命令行运行程序:调用 npm install;打电话 gulp ci
- 有问题的步骤是 运行 我编译的测试二进制文件上的 NUnit。
- 我无法通过命令行重现该问题。
环境信息:
- TeamCity v9.0.2(撰写本文时最新版本)
- Node v10.36(撰写本文时最新版本)
- Gulp v3.8.10(撰写本文时最新版本)
- NUnit.Runners nuget 包 2.6.4(撰写本文时最新版本)
这就说明了一切,对吧?
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
有比您的断言高两行的功能。它想捕获一个错误,将其映射到已知的东西中。 "default:" 表示这是一个未知错误,作者不知道。那么断言就这样死去吧,他不知道怎么处理才好。
那么现在,什么是libuv?这是一个网络图书馆。这完全取决于调用 uv_err_name(something) 时您在做什么。例如,可能是 getaddrinfo() 调用。底层 tcp 堆栈应该是 return 可识别的错误编号。显然,您的版本无法识别从 tcp 堆栈 returned 的内容。
所以,现在我们已经合理地理解了这个问题,我强烈建议更新与此相关的 libuv 库。重复测试。如果它再次失败,请验证您是否已连接到以太网(如果您使用的是可以关闭的 Wi-Fi)。
正如 Michael 所指出的,这是由于 libuv 网络库。
您的错误很可能来自库未处理的 EHOSTDOWN
代码,并导致您的进程失败。
关于这个 joyent repo or the libuv one 实际上有一些问题。
似乎 this commit 已经修复了它,现在可以使用 0.12.1 版本的 Node。
我的 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
一些细节:
- 我正在使用命令行运行程序:调用 npm install;打电话 gulp ci
- 有问题的步骤是 运行 我编译的测试二进制文件上的 NUnit。
- 我无法通过命令行重现该问题。
环境信息:
- TeamCity v9.0.2(撰写本文时最新版本)
- Node v10.36(撰写本文时最新版本)
- Gulp v3.8.10(撰写本文时最新版本)
- NUnit.Runners nuget 包 2.6.4(撰写本文时最新版本)
这就说明了一切,对吧?
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
有比您的断言高两行的功能。它想捕获一个错误,将其映射到已知的东西中。 "default:" 表示这是一个未知错误,作者不知道。那么断言就这样死去吧,他不知道怎么处理才好。
那么现在,什么是libuv?这是一个网络图书馆。这完全取决于调用 uv_err_name(something) 时您在做什么。例如,可能是 getaddrinfo() 调用。底层 tcp 堆栈应该是 return 可识别的错误编号。显然,您的版本无法识别从 tcp 堆栈 returned 的内容。
所以,现在我们已经合理地理解了这个问题,我强烈建议更新与此相关的 libuv 库。重复测试。如果它再次失败,请验证您是否已连接到以太网(如果您使用的是可以关闭的 Wi-Fi)。
正如 Michael 所指出的,这是由于 libuv 网络库。
您的错误很可能来自库未处理的 EHOSTDOWN
代码,并导致您的进程失败。
关于这个 joyent repo or the libuv one 实际上有一些问题。
似乎 this commit 已经修复了它,现在可以使用 0.12.1 版本的 Node。