当我的遥控器是嵌入式系统时,如何使用 IEx 的 :observer?

How can I use :observer from IEx when my remote is an embedded system?

我想从远程 IEx 演示 :observer GUI 的使用 shell。我的目标是 BEAM 运行 我在资源受限的嵌入式系统上的 Elixir 应用程序。

我使用 Buildroot 构建了远程 OS,包括对 Erlang 的支持。我添加了 elixir-lang 回购的结帐以给我 Elixir 和 IEx。 (版本报告为 1.13.0-dev,我使用的是 Erlang/OTP 22。)

我的主机 OS 是 Ubuntu,为了保持一致性,我使用相同版本的 Elixir 和 OTP。

我在远程机器上启动我的应用程序: iex --sname foo --cookie <cookie> -S mix run 并从我的主机连接到它: iex --sname bar --cookie <cookie> --remsh foo@<remote machine name>

这给了我一个遥控器 shell。但是,当我尝试输入 :observer.start() 时,出现错误 ERROR: Could not find 'wxe_driver.so' in: /usr/lib/erlang/lib/wx-1.9/priv

.so 文件实际上存在于我的 Ubuntu 机器上的该路径中,但不存在于缺少 WX 小部件(以及 X windows 和任何类型的图形输出硬件)的嵌入式系统中。有没有办法解决?我是不是做错了什么?

问题出在 --remsh。使用 --remsh 将打开一个远程会话,就像您以与典型 SSH 会话类似的方式从该机器执行 IEx 一样。

您需要使用 Node.connect/1 从本地 IEx 会话连接到远程节点,然后打开观察器 :observer.start()。这将需要通过 SSH 访问远程机器(您的嵌入式系统)并将两个端口从该系统转发到您的本地主机。 第一个端口来自 epmd - Erlang 端口管理器守护进程 - 第二个端口来自您系统的节点。

  • 运行 epmd -names 在您的嵌入式系统上获取两个端口。

  • 之后确保 epmd 不是 运行 在您的本地主机上(ps aux | grep epmd 如果是 运行 则杀死它)。它应该 运行 仅在您的嵌入式系统上。

  • 将两个端口转发到您的本地主机:

    $ ssh user@remote-embedded -L4369:localhost:4369 -L41437:localhost:41437

  • 再次在本地主机上启动一个新的 IEx 会话(没有 --remsh):

    $ iex -name bar@127.0.0.1 --cookie mycookie

  • 从此 IEx 会话连接到远程系统:

    > Node.connect(:"foo@127.0.0.1")

    这应该returntrue。请注意,我使用的是长名称(-name 而不是像您所做的 -sname),但短名称也应该有效。

  • 终于打开观察者了:

    > :observer.start()

    Select 来自“节点”菜单的远程系统。

之所以可行,是因为 Observer 对远程计算机运行了多个 RPC 调用,以便从该系统获取数据。这样您就不需要在嵌入式系统上安装任何“图形”。

要了解更多信息,请参阅 http://blog.plataformatec.com.br/2016/05/tracing-and-observing-your-remote-node/