在 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

解决此问题的一个好方法是将其指向现有数据库而不是示例数据库。