Erlang新手求教:如何附着到运行中应用查看DETS/ETS?求示例
当然可以!附着到运行中的Erlang应用查看ETS/DETS表完全可行
作为Erlang新手,能想到利用Erlang的特性来观测运行中的应用,说明你已经抓住了Erlang可观测性的核心优势之一。下面我给你一步步拆解操作流程,还有完整的示例:
第一步:确保目标应用节点可连接
首先,你的目标Erlang应用必须以命名节点的方式启动,并且要记住它的Cookie(节点间通信的验证密钥)。如果是你自己启动的测试应用,可以这么启动:
erl -sname my_running_app -setcookie mysecretcookie
启动后,在这个节点里创建测试用的ETS和DETS表:
% 创建一个公共可访问的ETS表(允许外部节点读取) ets:new(my_ets_table, [public, named_table]), ets:insert(my_ets_table, {user1, "Alice", 30}), ets:insert(my_ets_table, {user2, "Bob", 25}). % 创建并打开一个DETS表(存储到本地文件) dets:open_file(my_dets_table, [{file, "my_dets.dets"}, {type, set}]), dets:insert(my_dets_table, {product1, "Laptop", 999}), dets:insert(my_dets_table, {product2, "Phone", 599}).
第二步:附着到运行中的节点
打开另一个终端,启动一个新的Erlang节点,用相同的Cookie直接附着到目标节点。这里用-remsh参数可以一步进入目标节点的Shell:
erl -sname debugger_node -setcookie mysecretcookie -remsh my_running_app@your_hostname
提示:把
your_hostname换成你的机器实际主机名,不确定的话可以在目标节点里运行node()查看完整的节点名称(比如my_running_app@localhost)。
第三步:查看ETS表
附着成功后,你就可以在当前Shell里直接操作ETS表了:
% 列出所有当前存在的ETS表 ets:all(). % 输出里会包含我们创建的my_ets_table % 查看指定ETS表的详细信息(类型、大小、所有者等) ets:info(my_ets_table). % 进入交互式查看界面(按q退出,支持分页和搜索) ets:i(my_ets_table). % 直接把表内容转成列表输出 ets:tab2list(my_ets_table).
第四步:查看DETS表
DETS是磁盘存储的表,操作方式和ETS类似,只是需要确保表处于打开状态:
% 列出所有当前打开的DETS表 dets:all(). % 查看DETS表的详细信息 dets:info(my_dets_table). % 输出表的所有内容 dets:tab2list(my_dets_table).
新手注意事项
- 如果ETS表创建时用了
private属性,只有创建它的进程能访问,外部节点看不到;要让附着节点能读取,创建时记得加public或protected属性。 - 两个节点的Cookie必须完全一致,否则无法建立连接。你可以在目标节点里用
erlang:get_cookie()查看当前Cookie值。 - DETS表如果已经被关闭,需要先用
dets:open_file(my_dets_table, [{file, "my_dets.dets"}])重新打开才能查看。
内容的提问来源于stack exchange,提问作者Andrey Panin
相关产品推荐
相关产品推荐

