init_debug查看系统boot过程
原创文章,转载请注明: 转载自系统技术非业余研究
本文链接地址: init_debug查看系统boot过程
erl启动的时候有个参数 -init_debug 作用是
Makes init write some debug information while interpreting the boot script.
参见erlang system_principles的1.3节:Boot Scripts, 我们可以知道,每个erlang vm启动的时候,init进程都会去读取boot文件,来获取系统要启动那些服务。
如果我们不输入任何参数的话,,默认是其他start_clean.boot文件, 其内容如下:
$ cat ~/otp/erts/start_scripts/start_clean.script %% script generated at {2012,12,26} {16,12,32} {script, {"OTP APN 181 01","R15B03"}, [{preLoaded, [erl_prim_loader,erlang,init,otp_ring0,prim_file,prim_inet,prim_zip, zlib]}, {progress,preloaded}, {path,["$ROOT/lib/kernel-2.15.3/ebin","$ROOT/lib/stdlib-1.18.3/ebin"]}, {primLoad,[error_handler]}, {kernel_load_completed}, {progress,kernel_load_completed}, {path,["$ROOT/lib/kernel-2.15.3/ebin"]}, {primLoad, [application,application_controller,application_master, application_starter,auth,code,code_server,disk_log,disk_log_1, disk_log_server,disk_log_sup,dist_ac,dist_util,erl_boot_server, erl_ddll,erl_distribution,erl_epmd,erl_reply,error_logger, erts_debug,file,file_io_server,file_server,gen_sctp,gen_tcp,gen_udp, global,global_group,global_search,group,heart,hipe_unified_loader, inet,inet6_sctp,inet6_tcp,inet6_tcp_dist,inet6_udp,inet_config, inet_db,inet_dns,inet_gethost_native,inet_hosts,inet_parse,inet_res, inet_sctp,inet_tcp,inet_tcp_dist,inet_udp,kernel,kernel_config,net, net_adm,net_kernel,os,packages,pg2,ram_file,rpc,seq_trace, standard_error,user,user_drv,user_sup,wrap_log_reader]}, {path,["$ROOT/lib/stdlib-1.18.3/ebin"]}, {primLoad, [array,base64,beam_lib,binary,c,calendar,dets,dets_server,dets_sup, dets_utils,dets_v8,dets_v9,dict,digraph,digraph_utils,edlin, edlin_expand,epp,erl_bits,erl_compile,erl_eval,erl_expand_records, erl_internal,erl_lint,erl_parse,erl_posix_msg,erl_pp,erl_scan, erl_tar,error_logger_file_h,error_logger_tty_h,escript,ets, eval_bits,file_sorter,filelib,filename,gb_sets,gb_trees,gen, gen_event,gen_fsm,gen_server,io,io_lib,io_lib_format,io_lib_fread, io_lib_pretty,lib,lists,log_mf_h,math,ms_transform,orddict,ordsets, otp_internal,pg,pool,proc_lib,proplists,qlc,qlc_pt,queue,random,re, sets,shell,shell_default,slave,sofs,string,supervisor, supervisor_bridge,sys,timer,unicode,win32reg,zip]}, {progress,modules_loaded}, {path,["$ROOT/lib/kernel-2.15.3/ebin","$ROOT/lib/stdlib-1.18.3/ebin"]}, {kernelProcess,heart,{heart,start,[]}}, {kernelProcess,error_logger,{error_logger,start_link,[]}}, {kernelProcess,application_controller, {application_controller,start, [{application,kernel, [{description,"ERTS CXC 138 10"}, {vsn,"2.15.3"}, {id,[]}, {modules, [application,application_controller,application_master, application_starter,auth,code,packages,code_server, dist_util,erl_boot_server,erl_distribution,erl_reply, error_handler,error_logger,file,file_server, file_io_server,global,global_group,global_search, group,heart,hipe_unified_loader,inet6_tcp, inet6_tcp_dist,inet6_udp,inet6_sctp,inet_config, inet_hosts,inet_gethost_native,inet_tcp_dist,kernel, kernel_config,net,net_adm,net_kernel,os,ram_file,rpc, user,user_drv,user_sup,disk_log,disk_log_1, disk_log_server,disk_log_sup,dist_ac,erl_ddll, erl_epmd,erts_debug,gen_tcp,gen_udp,gen_sctp,inet, inet_db,inet_dns,inet_parse,inet_res,inet_tcp, inet_udp,inet_sctp,pg2,seq_trace,standard_error, wrap_log_reader]}, {registered, [application_controller,erl_reply,auth,boot_server, code_server,disk_log_server,disk_log_sup, erl_prim_loader,error_logger,file_server_2, fixtable_server,global_group,global_name_server,heart, init,kernel_config,kernel_sup,net_kernel,net_sup,rex, user,os_server,ddll_server,erl_epmd,inet_db,pg2]}, {applications,[]}, {included_applications,[]}, {env,[{error_logger,tty}]}, {maxT,infinity}, {maxP,infinity}, {mod,{kernel,[]}}]}]}}, {progress,init_kernel_started}, {apply, {application,load, [{application,stdlib, [{description,"ERTS CXC 138 10"}, {vsn,"1.18.3"}, {id,[]}, {modules, [array,base64,beam_lib,binary,c,calendar,dets, dets_server,dets_sup,dets_utils,dets_v8,dets_v9,dict, digraph,digraph_utils,edlin,edlin_expand,epp, eval_bits,erl_bits,erl_compile,erl_eval, erl_expand_records,erl_internal,erl_lint,erl_parse, erl_posix_msg,erl_pp,erl_scan,erl_tar, error_logger_file_h,error_logger_tty_h,escript,ets, file_sorter,filelib,filename,gb_trees,gb_sets,gen, gen_event,gen_fsm,gen_server,io,io_lib,io_lib_format, io_lib_fread,io_lib_pretty,lib,lists,log_mf_h,math, ms_transform,orddict,ordsets,otp_internal,pg,pool, proc_lib,proplists,qlc,qlc_pt,queue,random,re,sets, shell,shell_default,slave,sofs,string,supervisor, supervisor_bridge,sys,timer,unicode,win32reg,zip]}, {registered, [timer_server,rsh_starter,take_over_monitor, pool_master,dets]}, {applications,[kernel]}, {included_applications,[]}, {env,[]}, {maxT,infinity}, {maxP,infinity}]}]}}, {progress,applications_loaded}, {apply,{application,start_boot,[kernel,permanent]}}, {apply,{application,start_boot,[stdlib,permanent]}}, {apply,{c,erlangrc,[]}}, {progress,started}]}.
而boot文件是script文件的term_to_binary版本,演示下init加载过程:
$ erl -init_debug {progress,preloaded} {progress,kernel_load_completed} {progress,modules_loaded} {start,heart} {start,error_logger} {start,application_controller} {progress,init_kernel_started} {apply,{application,load,[{application,stdlib,[{description,"ERTS CXC 138 10"},{vsn,"1.19.1"},{id,[]},{modules,[array,base64,beam_lib,binary,c,calendar,dets,dets_server,dets_sup,dets_utils,dets_v8,dets_v9,dict,digraph,digraph_utils,edlin,edlin_expand,epp,eval_bits,erl_bits,erl_compile,erl_eval,erl_expand_records,erl_internal,erl_lint,erl_parse,erl_posix_msg,erl_pp,erl_scan,erl_tar,error_logger_file_h,error_logger_tty_h,escript,ets,file_sorter,filelib,filename,gb_trees,gb_sets,gen,gen_event,gen_fsm,gen_server,io,io_lib,io_lib_format,io_lib_fread,io_lib_pretty,lib,lists,log_mf_h,math,ms_transform,orddict,ordsets,otp_internal,pg,pool,proc_lib,proplists,qlc,qlc_pt,queue,random,re,sets,shell,shell_default,slave,sofs,string,supervisor,supervisor_bridge,sys,timer,unicode,win32reg,zip]},{registered,[timer_server,rsh_starter,take_over_monitor,pool_master,dets]},{applications,[kernel]},{included_applications,[]},{env,[]},{maxT,infinity},{maxP,infinity}]}]}} {progress,applications_loaded} {apply,{application,start_boot,[kernel,permanent]}} Erlang R16B (erts-5.10.1) [source] [64-bit] [smp:16:16] [async-threads:10] [hipe] [kernel-poll:false] {apply,{application,start_boot,[stdlib,permanent]}} {apply,{c,erlangrc,[]}} {progress,started} Eshell V5.10.1 (abort with ^G) 1>
当然如果只是简单的boot不会有什么问题,但是真实地情况是reltool在打包的时候,会把 xxx.app 文件里面,依赖的application都打进去,顺便启动起来。
比如:
{applications,[kernel,stdlib,sasl,os_mon,mnesia,ump_lib,ump_log,
ump_zk,ump_mq]}]}.
我们在填写.app文件的时候,可能会漏掉几个,结果发现系统不正常运作,这时候init_debug就能帮上大忙。
摘抄一段诊断:
{running_on_load_handler,ump_la_nifs}
ump_la_nifs on load result: ok
{on_load_handler_returned_ok,ump_la_nifs}
{running_on_load_handler,dyntrace}
{on_load_handler_returned_ok,dyntrace}
{running_on_load_handler,erlsha2}
{on_load_handler_returned_ok,erlsha2}
{running_on_load_handler,crypto}
{on_load_handler_returned_ok,crypto}
{running_on_load_handler,asn1rt_nif}
{on_load_handler_returned_ok,asn1rt_nif}
{apply,{application,start_boot,[stdlib,permanent]}}
{apply,{application,start_boot,[sasl,permanent]}}
{apply,{application,start_boot,[os_mon,permanent]}}
{apply,{application,start_boot,[mnesia,permanent]}}=INFO REPORT==== 24-Jun-2013::17:24:34 ===
alarm_handler: {set,{{disk_almost_full,”/usr”},[]}}=ERROR REPORT==== 24-Jun-2013::17:24:34 ===
Mnesia(‘rds2tae@10.232.64.75’): ** ERROR ** mnesia_event got {inconsistent_database, starting_partitioned_network, ‘rds2tae@10.232.64.74’}=ERROR REPORT==== 24-Jun-2013::17:24:34 ===
Mnesia(‘rds2tae@10.232.64.75’): ** ERROR ** mnesia_event got {inconsistent_database, starting_partitioned_network, ‘rds2tae@10.232.64.76’}
{apply,{application,start_boot,[ump_lib,permanent]}}
{apply,{application,start_boot,[lager,permanent]}}
{apply,{application,start_boot,[syslog,permanent]}}
{apply,{application,start_boot,[ump_log,permanent]}}
17:24:34.755 [info] Application lager started on node ‘rds2tae@10.232.64.75’
{apply,{application,start_boot,[erlzk,permanent]}}
{apply,{application,start_boot,[ump_zk,permanent]}}
我们很清楚的看到,这些依赖的application是如何启动的,按照什么样的顺序。问题马上就能定位出来。
祝玩的开心。
Post Footer automatically generated by wp-posturl plugin for wordpress.
Recent Comments