Debugging 如何检查实时应用程序上的DET?
我是Erlang新手,但我想知道是否有可能以某种方式连接到一个正在工作的应用程序,并检查它使用的ETS或DETS。如果是,你愿意举个小例子吗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节点的启动方式:
- 使用
来
- 通过Erlang分发打开远程shell(
)erl-remsh
快跑,快跑 如果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
然后,命令中的三条路径对应于:
的第一个命令添加到_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
- 根据运行节点启动时使用的内容,使用
或-name
-sname
- 使用唯一的节点名
- 使用与正在运行的节点相同的
选项,或者以相同的用户身份运行以访问相同的-setcookie
文件.erlang.cookie
- 使用
(“远程shell”)连接到正在运行的节点-remsh
- 使用
避免被视为Erlang集群的一部分-hidden
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