在 ARM (armv7l/arm64/aarch64) 上构建 mongo shell 3.2.x - 分段错误
Build mongo shell 3.2.x on ARM (armv7l/arm64/aarch64) - segmentation fault
在过去的几天里,我尝试了很多在 Linaro 集群上获得 mongo shell 运行ning on Ubuntu 16.04 for ARM64 (aarch64)。我目前正在为 ARM 架构上的 meteorjs 开发下一个版本分支。
TL;DR
虽然 mongod (DB) 在构建后 运行ning 很好,还没有看到问题,但不可能 运行ning mongo shell [即使没有 javascript (mozjs) 支持] 构建后。
最简单的构建:
mkdir -p /tmp/mongo-build
cd /tmp/mongo-build
git clone --branch "r3.2.6" --depth 1 https://github.com/mongodb/mongo.git
cd mongo
scons --disable-warnings-as-errors --prefix=/tmp/mongo-build/mongo --js-engine=mozjs mongo mongod
即使此构建将 运行 在所有经过测试的平台和架构(Linux 在 armv7l、aarch64、amd64 上)在编译过程中没有问题,结果在 运行宁程序不同。
运行 mongo 在 amd64 上构建后的命令:
只是 运行 mongo shell 并尝试连接到一个不存在的实例
./mongo mongodb://localhost:5002/sample
这将给出这个输出:
MongoDB shell version: 3.2.6
connecting to: mongodb://localhost:5002/sample
2016-07-05T14:10:23.772+0200 W NETWORK [thread1] Failed to connect to 127.0.0.1:5002, reason: errno:111 Connection refused
2016-07-05T14:10:23.772+0200 E QUERY [thread1] Error: couldn't connect to server localhost:5002, connection attempt failed :
connect@src/mongo/shell/mongo.js:223:14
@(connect):1:6
exception: connect failed
运行 mongo 在 aarch64/armv7l:
上构建后的命令
相反,ARMs 上的输出只是:
MongoDB shell version: 3.2.6
Segmentation fault (core dumped)
在我看来,TCP 连接部分可能会出现 "SEGMENTATION FAULT" 但我无法调试它。
如果有任何帮助,我会很高兴 运行。
提前致谢
汤姆
经过 运行 多次尝试和编译后,我更改了 mongodb 版本的分支并使用 r3.3.9。
虽然使用相同的 scons 参数,但 运行 似乎没有任何问题。我还没有深入了解版本的细节和变化,但是 运行ning 版本对我来说很好
mkdir -p /tmp/mongo-build
cd /tmp/mongo-build
git clone --branch "r3.3.9" --depth 1 https://github.com/mongodb/mongo.git
cd mongo
scons --disable-warnings-as-errors --prefix=/tmp/mongo-build/mongo --js-engine=mozjs mongo mongod
如果您发出 ./mongo --help 二进制文件仍然有效,但连接在处理不存在的数据库时出现问题。段错误而不是在不存在的数据库中优雅地失败。由于空指针取消引用。
违规代码在
/src/mongo/client/mongo_uri_connect.cpp
if (!_user.empty()) {
ret->auth(_makeAuthObjFromOptions(ret->getMaxWireVersion()));
}
return ret;
}
这里号称从3.2.8到3.3.9有效
https://jira.mongodb.org/browse/SERVER-23126
另一方面,如果您需要分片,请将 "core" 添加到 scons 行。
mongod、mongos 和 mongo 将它们全部包含在构建中。
scons --disable-warnings-as-errors --prefix=/tmp/mongo-build/mongo --js-engine=mozjs core
解决此问题的一个好方法是将其指向现有数据库而不是示例数据库。
在过去的几天里,我尝试了很多在 Linaro 集群上获得 mongo shell 运行ning on Ubuntu 16.04 for ARM64 (aarch64)。我目前正在为 ARM 架构上的 meteorjs 开发下一个版本分支。
TL;DR
虽然 mongod (DB) 在构建后 运行ning 很好,还没有看到问题,但不可能 运行ning mongo shell [即使没有 javascript (mozjs) 支持] 构建后。
最简单的构建:
mkdir -p /tmp/mongo-build cd /tmp/mongo-build git clone --branch "r3.2.6" --depth 1 https://github.com/mongodb/mongo.git cd mongo scons --disable-warnings-as-errors --prefix=/tmp/mongo-build/mongo --js-engine=mozjs mongo mongod
即使此构建将 运行 在所有经过测试的平台和架构(Linux 在 armv7l、aarch64、amd64 上)在编译过程中没有问题,结果在 运行宁程序不同。
运行 mongo 在 amd64 上构建后的命令:
只是 运行 mongo shell 并尝试连接到一个不存在的实例
./mongo mongodb://localhost:5002/sample
这将给出这个输出:
MongoDB shell version: 3.2.6 connecting to: mongodb://localhost:5002/sample 2016-07-05T14:10:23.772+0200 W NETWORK [thread1] Failed to connect to 127.0.0.1:5002, reason: errno:111 Connection refused 2016-07-05T14:10:23.772+0200 E QUERY [thread1] Error: couldn't connect to server localhost:5002, connection attempt failed : connect@src/mongo/shell/mongo.js:223:14 @(connect):1:6 exception: connect failed
运行 mongo 在 aarch64/armv7l:
上构建后的命令相反,ARMs 上的输出只是:
MongoDB shell version: 3.2.6 Segmentation fault (core dumped)
在我看来,TCP 连接部分可能会出现 "SEGMENTATION FAULT" 但我无法调试它。
如果有任何帮助,我会很高兴 运行。
提前致谢 汤姆
经过 运行 多次尝试和编译后,我更改了 mongodb 版本的分支并使用 r3.3.9。
虽然使用相同的 scons 参数,但 运行 似乎没有任何问题。我还没有深入了解版本的细节和变化,但是 运行ning 版本对我来说很好
mkdir -p /tmp/mongo-build cd /tmp/mongo-build git clone --branch "r3.3.9" --depth 1 https://github.com/mongodb/mongo.git cd mongo scons --disable-warnings-as-errors --prefix=/tmp/mongo-build/mongo --js-engine=mozjs mongo mongod
如果您发出 ./mongo --help 二进制文件仍然有效,但连接在处理不存在的数据库时出现问题。段错误而不是在不存在的数据库中优雅地失败。由于空指针取消引用。
违规代码在 /src/mongo/client/mongo_uri_connect.cpp
if (!_user.empty()) {
ret->auth(_makeAuthObjFromOptions(ret->getMaxWireVersion()));
}
return ret;
}
这里号称从3.2.8到3.3.9有效
https://jira.mongodb.org/browse/SERVER-23126
另一方面,如果您需要分片,请将 "core" 添加到 scons 行。 mongod、mongos 和 mongo 将它们全部包含在构建中。
scons --disable-warnings-as-errors --prefix=/tmp/mongo-build/mongo --js-engine=mozjs core
解决此问题的一个好方法是将其指向现有数据库而不是示例数据库。