gpt4 book ai didi

debugging - 能够从进程 ID 识别进程身份的最佳 erlang 方法是什么?

转载 作者:行者123 更新时间:2023-12-02 10:20:41 25 4
gpt4 key购买 nike

当我调试时,我通常会查看大约 5000 个进程,每个进程可能是大约 100 个 gen_server、fsms 等之一。如果我想知道 erlang 进程是什么,我可以这样做:

process_info(pid(0,1,0), initial_call).

得到如下结果:

{initial_call,{proc_lib,init_p,5}}

...这几乎没用。

最近,我想到了(请做好准备)用一个名称来注册每个进程,该名称告诉我该进程代表谁。例如,player_1150 是代表玩家 1150 的玩家进程。是的,我最终在一周的运行过程中生成了几百万个原子。 (当我的系统运行时未使用大约 8GB 实际内存(如果有的话)时,我很想听到关于将限制提高到 10,000,000 个原子的缺点的评论。)这样做意味着我可以在实时系统的控制台上,查询所有进程的消息队列有多长,找到最严重的进程,然后检查这些进程是否已注册并打印出它们注册的原子。

我遇到了一个障碍:我正在将进程从一个节点移动到另一个节点。现在一个播放器进程可以有 3 个不同的名称; player_1158、player_1158_弃用、player_1158_替换。我必须绝对确保以精确的时间注册和取消注册这些名称,以确保进程始终被命名并且适当的名称始终存在,并且我不会尝试注册某些正在死亡的进程已经拥有的名称。有一些溢出空间,因为这仅用于实时系统的控制台调试尽管如此,当我开始感觉这种机制正在影响我开发系统(移动进程的系统)的那一刻,我觉得是时候了做点别的事。

我现在有两个想法。将进程 ID 与其描述相关联的 ets 表:

ets:insert(self(), {player, 1158}).

我不太喜欢那个,因为我必须手动保持 table 干净。当玩家退出(或崩溃)时,有人负责确保他的数据从 ets 表中删除。

第二种选择是使用进程字典,存储类似的信息。当我对实时系统的探索让我想知道进程是谁时,我可以使用 process_info 查看他的进程字典。

我意识到这些解决方案在功能上都不是干净的,但考虑到系统本身永远不是这些数据的消费者,我并不太担心它。我需要某些调试工具才能快速轻松地工作,因此所描述的行为没有争议。是否有任何令人信服的论据可以采取这种或另一种方式(除了学术界的“不要使用_,它是邪恶的” jar 装垃圾?)我很高兴听到其他建议及其理由.

最佳答案

您应该尝试gproc ,这是一个非常方便的保存流程元数据的应用程序。

一个进程可以用多个名称注册,并且您可以将任意属性与进程关联(其中键和值可以是任何 erlang 术语)。 gproc 还监视已注册的进程,并在崩溃时自动取消注册它们。

关于debugging - 能够从进程 ID 识别进程身份的最佳 erlang 方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11856204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com