Today’s Erlang Thursday continues with another function in the c
module, c:i/0.
c:i/0
reports the system information, displaying information about all the processes on a given node.
c:i(). % Pid Initial Call Heap Reds Msgs % Registered Current Function Stack % <0.0.0> otp_ring0:start/2 987 4987 0 % init init:loop/1 2 % <0.3.0> erlang:apply/2 6772 823443 0 % erl_prim_loader erl_prim_loader:loop/3 6 % <0.6.0> gen_event:init_it/6 376 220 0 % error_logger gen_event:fetch_msg/5 8 % <0.7.0> erlang:apply/2 1598 463 0 % application_controlle gen_server:loop/6 7 % <0.9.0> application_master:init/4 376 44 0 % application_master:main_loop/2 6 % <0.10.0> application_master:start_it/4 233 69 0 % application_master:loop_it/4 5 % <0.11.0> supervisor:kernel/1 4185 49109 0 % kernel_sup gen_server:loop/6 9 % <0.12.0> rpc:init/1 233 35 0 % rex gen_server:loop/6 9 % <0.13.0> global:init/1 233 51 0 % global_name_server gen_server:loop/6 9 % <0.14.0> erlang:apply/2 233 19 0 % global:loop_the_locker/1 5 % <0.15.0> erlang:apply/2 233 3 0 % global:loop_the_registrar/0 2 % <0.16.0> inet_db:init/1 233 206 0 % inet_db gen_server:loop/6 9 % <0.17.0> global_group:init/1 233 59 0 % global_group gen_server:loop/6 9 % <0.18.0> file_server:init/1 2586 2562 0 % file_server_2 gen_server:loop/6 9 % <0.19.0> erlang:apply/2 2586 155919 0 % code_server code_server:loop/1 3 % <0.20.0> supervisor_bridge:standard_error/ 233 41 0 % standard_error_sup gen_server:loop/6 9 % <0.21.0> erlang:apply/2 233 9 0 % standard_error standard_error:server_loop/1 2 % <0.22.0> supervisor_bridge:user_sup/1 610 87 0 % gen_server:loop/6 9 % <0.23.0> erlang:apply/2 233 24 0 % user user:server_loop/2 5 % <0.24.0> kernel_config:init/1 233 286 0 % gen_server:loop/6 9 % <0.25.0> supervisor:kernel/1 233 58 0 % kernel_safe_sup gen_server:loop/6 9 % <0.29.0> kjell_profile:init/1 987 27100 0 % kjell_profile gen_server:loop/6 9 % <0.30.0> kjell_extension:init/1 2586 3903 0 % kjell_extension gen_server:loop/6 9 % <0.45.0> k_user_drv:server/2 987 2218 0 % user_drv k_user_drv:server_loop/5 8 % <0.46.0> k_group:server/3 987 14541 0 % k_group:server_loop/3 4 % <0.47.0> erlang:apply/2 28690 4406 0 % kjell:shell_rep/4 17 % <0.48.0> erlang:apply/2 1598 20585 0 % c:pinfo/1 49 % Total 58707 1110447 0 % 237 % ok
We can see that it returns the process id (pid), the initial function that started the process, the size of the heap, the number of reductions, the number of messages in the message queue, the registered name, the current function the process is in, and the stack size.
c:i/0
also includes a total of the total heap size, reductions, message queue size and stack size.
There c
module also includes a c:ni/0, that reports the system information above across all nodes.
Looking at the process info, we can find a couple of processes related to kjell, which I used instead of erl
for ease of finding their process information.
Looking at one of the kjell related processes, we can grab that pid, and do a deeper inspection of that process by calling c:i/3, which displays information about a process, but can reference the pid by the 3 integer values that make up the process’s pid.
c:i(0, 47, 0). % [{current_function,{kjell,shell_rep,4}}, % {initial_call,{erlang,apply,2}}, % {status,waiting}, % {message_queue_len,0}, % {messages,[]}, % {links,[<0.48.0>,<0.46.0>]}, % {dictionary,[{{result,1},ok}, % {{command,1},[{call,1,{remote,1,{atom,1,c},{atom,1,i}},[]}]}, % {evaluator,<0.48.0>}]}, % {trap_exit,true}, % {error_handler,error_handler}, % {priority,normal}, % {group_leader,<0.46.0>}, % {total_heap_size,46421}, % {heap_size,28690}, % {stack_size,17}, % {reductions,4479}, % {garbage_collection,[{min_bin_vheap_size,46422}, % {min_heap_size,233}, % {fullsweep_after,65535}, % {minor_gcs,2}]}, % {suspending,[]}]
When looking at the information related to a specific process, we can see it shows the linked process, messages and message queue length, heap and stack information, ad various other settings that could be of use.
Again, this is not as pretty as the observer
application, but they come in handy when you don’t have access past a terminal, as in working from a jump box, but it gives you a good idea of what is going on in your running Erlang node.
–Proctor