Debugging 如何检查实时应用程序上的DET?

Debugging 如何检查实时应用程序上的DET?,debugging,erlang,ets,dets,Debugging,Erlang,Ets,Dets,我是Erlang新手,但我想知道是否有可能以某种方式连接到一个正在工作的应用程序,并检查它使用的ETS或DETS。如果是,你愿意举个小例子吗 谢谢大家! 有两种方法可以做到这一点,这两种方法都可能有效,也可能无效,具体取决于Erlang节点的启动方式: 使用来 通过Erlang分发打开远程shell(erl-remsh) 无论哪种方式,最终都会得到一个erlangshell,您可以在其中检查表 快跑,快跑 如果Erlang节点是用run\u erl包装器启动的,那么您可以用to\u erl

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


谢谢大家!

有两种方法可以做到这一点,这两种方法都可能有效,也可能无效,具体取决于Erlang节点的启动方式:

  • 使用
  • 通过Erlang分发打开远程shell(
    erl-remsh
无论哪种方式,最终都会得到一个erlangshell,您可以在其中检查表


快跑,快跑 如果Erlang节点是用
run\u erl
包装器启动的,那么您可以用
to\u erl
连接到正在运行的节点。您可以看到运行时使用的
run\u erl
命令:

ps -C run_erl -fww
例如,如果Erlang节点是使用以下命令启动的:

run_erl -daemon /my/erlang/node/tmp/ /my/erlang/node/log/ /my/erlang/node/start
然后,命令中的三条路径对应于:

  • 保存命名管道的目录
  • 记录标准输出的目录
  • 用于实际启动Erlang节点的命令
  • 您希望将
    的第一个命令添加到_erl
    ,因此命令为:

    to_erl /my/erlang/node/tmp/
    
    注意后面的斜杠<代码>到_erl
    如果丢失,则会混淆

    要退出,请键入
    Ctrl-D


    使用Erlang分发连接 如果Erlang节点作为分布式节点运行,并且您知道秘密“cookie”,则可以启动另一个节点并打开远程shell

    哪个节点名?长还是短? 您需要知道正在运行的节点的节点名,以及它是使用“长”还是“短”节点名运行

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

    主机名在命令中可能是显式的,也可能是隐式的。如果该命令类似于以下命令之一,则您已经知道确切的节点名称:

    erl -name myerlangnode@mymachine.example.com
    erl -sname myerlangnode@mymachine
    
    (myerlangnode@mymachine)1>
    
    但是,如果
    -name
    -sname
    选项仅指定“裸”节点名,则需要确定它选择的主机名的开头:

    erl -name myerlangnode    # node name is actually myerlangnode@mymachine.example.com
    erl -sname myerlangnode   # node name is actually myerlangnode@mymachine
    
    饼干是什么? 当一个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。您可以通过查看提示来判断,提示应该告诉您节点名称:

    erl -name myerlangnode@mymachine.example.com
    erl -sname myerlangnode@mymachine
    
    (myerlangnode@mymachine)1>
    
    如果未显示正确的节点名称,请参见问题

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


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

    ets:tab2list(my_table).
    
    对于DET,您可以使用
    DETS:match_object
    通配符模式:

    dets:match_object(my_table, '_').
    


    1除非该节点是作为非分布式节点启动的,然后通过
    net\u kernel:start
    转换为分布式节点

    您可以使用Observer查看ETS表格(如果您有权访问)。在erlang shell中,只需键入
    observer:start()。
    即可打开GUI

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

    启动命名节点

    $erl -name application@hostname
    
    从不同的机器或终端启动新的erlang shell

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

    >r 'application@hostname'
    >c
    
    之后,您可以调用任何命令,就像您在该机器上的任何位置一样,调用任何模块:函数,并访问ETS表

    如果您在同一台机器上,则没有其他设备,如果您在不同的机器上,则必须设置Cookie以使其匹配,否则您将无法连接

    断开连接时要小心,退出前必须切换到本地节点,或者关闭临时应用程序,不要关闭真正的应用程序

    Rebar3

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

    使用Rebar3,可以使用start命令启动应用程序,并使用attach命令连接到正在运行的应用程序。必须使用Rebar3发布才能使用这些命令

    样本:

    rel/my_app/bin/my_app start
    rel/my_app/bin/my_app attach
    
    之后,按照上面提到的方法访问E