如何在实时应用程序中检查DETS?

时间:2018-01-15 09:37:17

标签: debugging erlang ets dets

我是Erlang的新手,但我想知道是否有可能以某种方式附加到正在运行的应用程序并检查它正在使用的ETS或DETS。如果是的话,你愿意举一个小例子吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

有两种方法可以执行此操作,根据Erlang节点的启动方式,这两种方式都可能有效或无效:

  • 使用to_erl
  • 在Erlang发行版上打开远程shell(erl -remsh

无论哪种方式,你都会得到一个Erlang shell,你可以在那里检查你的表。

run_erl和to_erl

如果Erlang节点是使用run_erl包装器启动的,那么您可以使用to_erl连接到正在运行的节点。您可以看到运行时使用的run_erl命令:

ps -C run_erl -fww

例如,如果使用此命令启动Erlang节点:

run_erl -daemon /my/erlang/node/tmp/ /my/erlang/node/log/ /my/erlang/node/start

然后命令中的三个路径对应于:

  1. 保存命名管道的目录
  2. 记录标准输出的目录
  3. 实际启动Erlang节点的命令
  4. 你想要to_erl的第一个,所以命令是:

    to_erl /my/erlang/node/tmp/
    

    注意尾随斜线!如果遗漏,to_erl会感到困惑。

    要退出,请输入Ctrl-D

    使用Erlang发布连接

    如果Erlang节点作为分布式节点运行,并且您知道密码" cookie",则可以启动另一个节点并打开远程shell。

    哪个节点名称?长还是短?

    您需要知道正在运行的节点的节点名称,以及它是否与" long"一起运行。或"短"节点名称。

    在" long"节点名称,主机部分是完全限定的域名或IP地址,但在"短"节点名称,主机部分只是一个主机名,没有点。如果Erlang节点是使用-name选项启动的,则它使用长节点名称,如果它是使用-sname选项启动的,则它使用短节点名称。如果没有使用任何选项,则它不是分布式节点,也无法连接到它。 1

    主机名可能在命令中是显式的或隐式的。如果该命令看起来像其中之一,那么您已经知道确切的节点名称:

    erl -name myerlangnode@mymachine.example.com
    erl -sname myerlangnode@mymachine
    

    但如果-name-sname选项仅指定"裸"节点名称,您需要确定它选择的主机名:

    erl -name myerlangnode    # node name is actually myerlangnode@mymachine.example.com
    erl -sname myerlangnode   # node name is actually myerlangnode@mymachine
    

    什么是cookie?

    当一个Erlang节点连接到另一个时,两个节点都需要具有相同的" cookie"配置,否则握手将失败。可以从运行Erlang节点的用户的主目录中的文件.erlang.cookie读取cookie,也可以在启动节点时使用-setcookie命令显式设置cookie。

    让我们联系!

    现在我们知道了:

    • 正在运行的节点使用的确切节点名称
    • 节点是以-name还是-sname启动的(即长节点名称还是短节点名称)
    • 是否从用户的主目录中读取cookie或使用-setcookie
    • 进行设置

    现在我们可以联系了!我们需要启动一个临时的Erlang节点:

    • 根据
    • 启动的运行节点使用-name-sname
    • 使用唯一的节点名称
    • 使用与运行节点相同的-setcookie选项,或以同一用户身份运行以访问相同的.erlang.cookie文件
    • 使用-remsh("远程shell")连接到正在运行的节点。
    • 使用-hidden来避免被视为Erlang群集的一部分

    这样的事情:

    erl -hidden -name mytmpnode -setcookie secret -remsh myerlangnode@mymachine.example.com
    erl -hidden -sname mytmpnode -setcookie secret -remsh myerlangnode@mymachine
    

    这应该在运行节点上打开一个shell。您可以通过查看提示来告知,该提示应该告诉您节点名称:

    (myerlangnode@mymachine)1>
    

    如果它没有显示正确的节点名称,请参阅问题Erlang remote shell not working

    要退出,请键入Ctrl-g,然后键入q

    检查ETS或DETS表

    一旦有了Erlang shell,就可以检查表。使用ets:all()dets:all()列出现有表格。对于ETS,您可以使用ets:tab2list,它显示表格中的所有条目:

    ets:tab2list(my_table).
    

    对于DETS,您可以将dets:match_object'_'通配符模式一起使用:

    dets:match_object(my_table, '_').
    

    1 除非节点作为非分布式节点启动,后来变为带有net_kernel:start的分布式节点。功能

答案 1 :(得分:0)

如果您有权访问ETS表,则可以使用它来查看ETS表。从erlang shell只需输入observer:start().即可打开GUI。

要连接到正在运行的命名节点,请在Erlang Shell中使用“连接到远程节点”选项。

启动命名节点

$erl -name application@hostname

从另一台机器或终端启动一个新的erlang shell

$erl -name temp@hostname

从临时erlang shell连接到应用程序,按Ctrl + g,然后按h?以获取选项列表。选项r连接到远程节点,c连接到新作业。

>r 'application@hostname'
>c

之后,您可以调用任何命令,就像在该计算机上的位置一样,调用任何模块:函数,并访问ETS表。

如果你在同一台机器上没有别的,如果你在不同的机器上,你必须设置cookie才能匹配,否则你将无法连接。

断开连接时要小心,在退出之前必须切换到本地节点,或者终止临时应用程序,不要杀死真正的应用程序。

<强> Rebar3

如今,很多人使用Rebar3来创建和运行Erlang项目,如果你不这样做,我强烈建议你使用它。

使用Rebar3,您可以使用start命令启动应用程序,并使用attach命令附加到正在运行的应用程序。您必须使用Rebar3发布才能使用这些命令。 More info here

示例:

rel/my_app/bin/my_app start
rel/my_app/bin/my_app attach

之后如上所述进行访问ETS或使用erlang man pages中列出的任何ets命令。

使用ctrl + D分离。

混合搭配 您可以使用常规erl -name temp@hostname shell连接到使用rebar3启动的项目。只要cookie匹配并且您知道节点名称,就不必使用Rebar3连接到正在运行的应用程序。