- 浏览: 31703 次
- 性别:
- 来自: 北京
最新评论
-
liumengfan:
{beam_dynamic_libraries, get_dy ...
system_info模块 -
liumengfan:
{environment, [split_env( ...
system_info模块 -
liumengfan:
其中{environment_erts, os_getenv ...
system_info模块 -
liumengfan:
centos再安装erlang之前,先安装如下软件:yum i ...
SystemTap and Erlang: a tutorial -
liumengfan:
判断是否是内部port的程序:#define is_inter ...
erlang判断内部pid的方法
引用Erlang如何查看gen_server系列的状态 (高级)
gen_server在erlang otp编程中的地位是无可撼动的,几乎都是gen_server或者gen_fsm的模型。那么程序运行起来的时候 我们如何查看gen_server的内部状态呢。有2种方法:
1. 自己写个类似于info这样的函数,来获取状态。
2. 利用系统现有的架构。sasl应用带了一个si的东西 全名是status inspector, 这个东西就是设计来帮用户解决这个问题的。
实验开始:
root@nd-desktop:~# cat abc.erl
-module(abc).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-export([format_status/2]).
-export([test/0]).
-record(state, {a, b}).
-define(SERVER, ?MODULE).
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
test()->
gen_server:call(?SERVER, {test, "param1"}).
init([]) ->
{ok, #state{a=hello, b=world}}.
handle_call({test, _} = Request, _From, State) ->
io:format("got msg ~p~n", [Request]),
{reply, ok, State};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
format_status(_Opt, [_PDict, #state{a=A,
b = B
}]) ->
[{data, [{"a===", A},
{"b===", B}]}].
root@nd-desktop:~# erl -boot start_sasl
Erlang R13B03 (erts-5.7.4) 1[/source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.35.0>},
{name,alarm_handler},
{mfa,{alarm_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.36.0>},
{name,overload},
{mfa,{overload,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.34.0>},
{name,sasl_safe_sup},
{mfa,
{supervisor,start_link,
[{local,sasl_safe_sup},sasl,safe]}},
{restart_type,permanent},
{shutdown,infinity},
{child_type,supervisor}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.37.0>},
{name,release_handler},
{mfa,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
application: sasl
started_at: nonode@nohost
Eshell V5.7.4 (abort with ^G)
1> si:start(). %必须手动启动
=PROGRESS REPORT==== 29-Oct-2009::16:07:31 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.43.0>},
{name,si_server},
{mfa,{si_sasl_supp,start_link,[[]]}},
{restart_type,temporary},
{shutdown,brutal_kill},
{child_type,worker}]
{ok,<0.43.0>}
2> si:help().
Status Inspection tool - usage
==============================
For all these functions, Opt is an optional argument
which can be 'normal' or 'all'; default is 'normal'.
If 'all', all information will be printed.
A Pid can be: "<A.B.C>", {A, B, C}, B, a registered_name or an abbrev.
ANY PROCESS
si:pi([Opt,] Pid) - Formatted information about any process that
SI recognises.
si:pi([Opt,] A,B,C) - Same as si:pi({A, B, C}).
si:ppi(Pid) - Pretty formating of process_info.
Works for any process.
MISC
si:abbrevs() - Lists valid abbreviations.
si:start_log(Filename) - Logging to file.
si:stop_log()
si:start() - Starts Status Inspection (the si_server).
si:start([{start_log, FileName}])
si:stop() - Shut down SI.
ok
3> abc:start_link().
{ok,<0.46.0>}
4> abc:test().
got msg {test,"param1"}
ok
5> sys:log(abc,true). %打开gen_server的消息log功能
ok
6> abc:test(). %这个请求消息被记录
got msg {test,"param1"}
ok
7> si:pi(abc). %好戏开始
Status for generic server abc
===============================================================================
Pid <0.46.0>
Status running
Parent <0.41.0>
Logged events %这个是log到的消息
{10,
[{{out,ok,<0.41.0>,{state,hello,world}},
abc,
{gen_server,print_event}},
{{in,{'$gen_call',{<0.41.0>,#Ref<0.0.0.85>},{test,"param1"}}},
abc,
{gen_server,print_event}}]}
%这个是format_status的结果 如果没有format_status那么导出是 {a=hello, b=world}
a=== hello
b=== world
ok
8> si:ppi(abc).
Pretty Process Info
-------------------
[{registered_name,abc},
{current_function,{gen_server,loop,6}},
{initial_call,{proc_lib,init_p,5}},
{status,waiting},
{message_queue_len,0},
{messages,[]},
{links,[<0.41.0>]},
{dictionary,[{'$ancestors',[<0.41.0>]},{'$initial_call',{abc,init,1}}]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.25.0>},
{total_heap_size,233},
{heap_size,233},
{stack_size,9},
{reductions,117},
{garbage_collection,[{fullsweep_after,65535},{minor_gcs,0}]},
{suspending,[]}]
ok
9> sys:get_status(abc).
{status,<0.46.0>,
{module,gen_server},
[[{'$ancestors',[<0.41.0>]},{'$initial_call',{abc,init,1}}],
running,<0.41.0>,
[{log,{10,
[{{out,ok,<0.41.0>,{state,hello,world}},
abc,
{gen_server,print_event}},
{{in,{'$gen_call',{<0.41.0>,#Ref<0.0.0.85>},
{test,"param1"}}},
abc,
{gen_server,print_event}}]}}],
[abc,{state,hello,world},abc,infinity]]}
结论:
这个是文档未公开的功能。上面演示了如何sys打开log, 如何察看gen_server的状态
引用
gen_server在erlang otp编程中的地位是无可撼动的,几乎都是gen_server或者gen_fsm的模型。那么程序运行起来的时候 我们如何查看gen_server的内部状态呢。有2种方法:
1. 自己写个类似于info这样的函数,来获取状态。
2. 利用系统现有的架构。sasl应用带了一个si的东西 全名是status inspector, 这个东西就是设计来帮用户解决这个问题的。
实验开始:
root@nd-desktop:~# cat abc.erl
-module(abc).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-export([format_status/2]).
-export([test/0]).
-record(state, {a, b}).
-define(SERVER, ?MODULE).
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
test()->
gen_server:call(?SERVER, {test, "param1"}).
init([]) ->
{ok, #state{a=hello, b=world}}.
handle_call({test, _} = Request, _From, State) ->
io:format("got msg ~p~n", [Request]),
{reply, ok, State};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
format_status(_Opt, [_PDict, #state{a=A,
b = B
}]) ->
[{data, [{"a===", A},
{"b===", B}]}].
root@nd-desktop:~# erl -boot start_sasl
Erlang R13B03 (erts-5.7.4) 1[/source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.35.0>},
{name,alarm_handler},
{mfa,{alarm_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.36.0>},
{name,overload},
{mfa,{overload,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.34.0>},
{name,sasl_safe_sup},
{mfa,
{supervisor,start_link,
[{local,sasl_safe_sup},sasl,safe]}},
{restart_type,permanent},
{shutdown,infinity},
{child_type,supervisor}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.37.0>},
{name,release_handler},
{mfa,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
application: sasl
started_at: nonode@nohost
Eshell V5.7.4 (abort with ^G)
1> si:start(). %必须手动启动
=PROGRESS REPORT==== 29-Oct-2009::16:07:31 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.43.0>},
{name,si_server},
{mfa,{si_sasl_supp,start_link,[[]]}},
{restart_type,temporary},
{shutdown,brutal_kill},
{child_type,worker}]
{ok,<0.43.0>}
2> si:help().
Status Inspection tool - usage
==============================
For all these functions, Opt is an optional argument
which can be 'normal' or 'all'; default is 'normal'.
If 'all', all information will be printed.
A Pid can be: "<A.B.C>", {A, B, C}, B, a registered_name or an abbrev.
ANY PROCESS
si:pi([Opt,] Pid) - Formatted information about any process that
SI recognises.
si:pi([Opt,] A,B,C) - Same as si:pi({A, B, C}).
si:ppi(Pid) - Pretty formating of process_info.
Works for any process.
MISC
si:abbrevs() - Lists valid abbreviations.
si:start_log(Filename) - Logging to file.
si:stop_log()
si:start() - Starts Status Inspection (the si_server).
si:start([{start_log, FileName}])
si:stop() - Shut down SI.
ok
3> abc:start_link().
{ok,<0.46.0>}
4> abc:test().
got msg {test,"param1"}
ok
5> sys:log(abc,true). %打开gen_server的消息log功能
ok
6> abc:test(). %这个请求消息被记录
got msg {test,"param1"}
ok
7> si:pi(abc). %好戏开始
Status for generic server abc
===============================================================================
Pid <0.46.0>
Status running
Parent <0.41.0>
Logged events %这个是log到的消息
{10,
[{{out,ok,<0.41.0>,{state,hello,world}},
abc,
{gen_server,print_event}},
{{in,{'$gen_call',{<0.41.0>,#Ref<0.0.0.85>},{test,"param1"}}},
abc,
{gen_server,print_event}}]}
%这个是format_status的结果 如果没有format_status那么导出是 {a=hello, b=world}
a=== hello
b=== world
ok
8> si:ppi(abc).
Pretty Process Info
-------------------
[{registered_name,abc},
{current_function,{gen_server,loop,6}},
{initial_call,{proc_lib,init_p,5}},
{status,waiting},
{message_queue_len,0},
{messages,[]},
{links,[<0.41.0>]},
{dictionary,[{'$ancestors',[<0.41.0>]},{'$initial_call',{abc,init,1}}]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.25.0>},
{total_heap_size,233},
{heap_size,233},
{stack_size,9},
{reductions,117},
{garbage_collection,[{fullsweep_after,65535},{minor_gcs,0}]},
{suspending,[]}]
ok
9> sys:get_status(abc).
{status,<0.46.0>,
{module,gen_server},
[[{'$ancestors',[<0.41.0>]},{'$initial_call',{abc,init,1}}],
running,<0.41.0>,
[{log,{10,
[{{out,ok,<0.41.0>,{state,hello,world}},
abc,
{gen_server,print_event}},
{{in,{'$gen_call',{<0.41.0>,#Ref<0.0.0.85>},
{test,"param1"}}},
abc,
{gen_server,print_event}}]}}],
[abc,{state,hello,world},abc,infinity]]}
结论:
这个是文档未公开的功能。上面演示了如何sys打开log, 如何察看gen_server的状态
发表评论
-
erlang host address
2014-03-07 13:40 725在rabbitMQ看到一段关于转换地址的代码: 留着以后用 ... -
record小记
2014-03-06 17:46 623今天阅读rabbitMQ代码,遇到一段代码很疑惑: try ... -
Distributed Semaphores with RabbitMQ
2014-03-04 21:54 1337翻译自(http://www.rabbitmq.com/blo ... -
system_info模块
2013-07-31 22:16 1067在看了Erlang新增全面的系统信息收集器-system_in ... -
erlang的gdb调试
2013-07-08 21:00 1580当我们完成erlang的正常配置和编译后,我们可以构建一个de ... -
SystemTap and Erlang: a tutorial
2013-07-06 19:16 1208参照该文章安装SystemTap and Erlang: a ... -
列表[A||boolen]
2013-07-06 16:14 780今天读到riak_sysmon时, ... -
erlang的erl_eval
2013-07-05 13:56 1148自己尝试使用erl_eval做一些联系,发掘改模块的功能: ... -
使用erlang实现动态替换字符串中的变量
2013-07-05 13:18 1593通过erlang,我们可以使用 {ok, Ts, _} = e ... -
使用erlang的动态执行编写DSL
2013-07-05 12:54 1358今天看到Erlang 动态执行和erlang动态解释, 实验的 ... -
通过port获取相应的节点名
2013-07-04 23:41 990今天看了霸爷的节点间通讯的通道微调和谁引起busy_dist_ ... -
erlang的abstract_code代码
2013-07-04 21:04 665在看了霸爷的erlang的abstract code之后,自己 ... -
实验CPU密集型计算
2013-07-04 20:40 1237今天实验了一下霸爷博 ... -
erlang判断内部pid的方法
2013-07-04 13:48 1430在erl_term.h文件里: #define _TAG_ ... -
inet:setopts/2函数
2013-07-03 16:18 772下面引用霸爷的话,给自己做一个笔记 引用inet_drv内部每 ... -
erlang的内联编译
2013-07-02 23:42 1271今天再erlang inline 编译中读到erlang的函数 ... -
erlang:port_command函数
2013-07-02 22:10 3277今天读到褚霸博客里的g ... -
iolist类型
2013-07-02 21:47 791今天读到http://blog.yufeng.info的gen ... -
epmd的启动参数3
2013-07-01 21:28 1088和epmd相关的环境变量 ERL_EPMD_RELAXED_ ... -
epmd的启动参数2
2013-07-01 21:07 1054使用epmd的-port选项时,实验的例子是: [liuf ...
相关推荐
erlang-gen_tcp手册,详细完整,网络tcp开发好东东
关于在 Erlang 风格的 gen_server 上进行 Ocaml/Async 尝试。
个人学习Erlang的时候自己写的一个基于gen_tcp的聊天室,功能有注册,登陆,获得登陆时间,聊天次数,上次登陆时间等等,资源里有完整代码,注释也很详细.
esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...
通用 TCP 服务器 通用 TCP 服务器( gen_tcp_server ) 是一种 Erlang 行为,提供快速简便的方法将 TCP 服务器功能添加到您的应用程序。 它被实现为管理 TCP 连接的主管,因为它是孩子。如何使用它? 运行make来构建。...
是erlang_otp_20.3 的win64安装包,内为exe文件,一路next即可安装完成 是适用于多线程、分布式开发的语言,也是如rabbitmq等重要工具的必须品 使用前需要配置环境变量:1.变量名为ERLANG_HOME,变量值为安装Erlang...
erlang_otp_win64_25.0
gen_server简介 Gen_server实现了通用服务器client_server原理,几个不同的客户端去分享服务端管理的资源(如图),gen_server提供标准的接口函数和包含追踪功能以及错误报告来实现通用的服务器,同时可以作为OTP监控...
这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载
erlang tcp_servererlang tcp_servererlang tcp_server
erlang 22.3版本 erlang_otp_src_22.3 安装说明https://blog.csdn.net/tangcv/article/details/111841082
erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册
erlang官网下载速度太慢了,无法忍受,erlang_otp_src_22.3.tar.gz+rabbitmq-server-3.8.3-1.el6.noarch.rpm
erlang-sd_notify-1.0-2.el7.x86_64.rpm
erlang-syntax_tools-19.3.6.4-1.el7.x86_64.rpm
实现了Erlang B/C功能,支持大容量计算
erlang_otp_22.2_win64.exe & rabbitmq-server-3.8.3.exe
Erlang_In_Anger pdf 语言
esl-erlang_19.3_osx_10.10_amd64.dmg
Erlang_OTP_设计原理