erlang会在进程启动时记录吗?

Joe*_*Joe 5 erlang

我正在监视一个Erlang应用程序,我正在尝试确定一个特定的PID运行了多长时间.绝对时间戳或持续时间对我有用,但我没有在process_info中或通过sys模块看到这些数据位.有没有办法从Erlang VM中获取此信息?

我可以从ps命令获取整个VM的开始时间,但是没有任何个人Erlang进程的可见性.

编辑:

我注意到当VM崩溃时,erl_crash.dump包含每个进程的开始时间戳,所以我知道它就在那里!

Rog*_*mbe 4

tl;dr:是的,但你无法做到这一点。

如果您深入研究https://github.com/erlang/otp上的 OTP 源代码,您会发现(通过搜索“erl_crash”)负责写入故障转储的文件名为erts/emulator/beam/break.c.

搜索该文件中的“started”(这是一个很好的猜测,并且它是故障转储中出现的内容)将找到第248-249 行(所有行号都基于 OTP-18.3.1 标记),如下所示:

approx_started = (time_t) p->approx_started;
erts_print(to, to_arg, "Started: %s", ctime(&approx_started));
Run Code Online (Sandbox Code Playgroud)

搜索源代码的其余部分approx_started显示它被声明为erts/emulator/beam/erl_process.h的成员struct process。它erts/emulator/beam/erl_process.c. 唯一读取它的位置在写入故障转储时。break.c

所以,是的,Erlang确实记录了进程启动的(大约)时间。但是,不,你无法到达它。

我不知道为什么它是“大约”。