我正在监视一个Erlang应用程序,我正在尝试确定一个特定的PID运行了多长时间.绝对时间戳或持续时间对我有用,但我没有在process_info中或通过sys模块看到这些数据位.有没有办法从Erlang VM中获取此信息?
我可以从ps命令获取整个VM的开始时间,但是没有任何个人Erlang进程的可见性.
编辑:
我注意到当VM崩溃时,erl_crash.dump包含每个进程的开始时间戳,所以我知道它就在那里!
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确实记录了进程启动的(大约)时间。但是,不,你无法到达它。
我不知道为什么它是“大约”。