gen_server:format_status/2 only works with registered processes

Raimo Niskanen <>
Mon Mar 24 13:52:24 CET 2003


Vance Shipley wrote:
 > OK, I found the problem.  The following patch to lists.erl does it:
 >
 > *** lists.erl.dist      Thu Mar 20 17:56:16 2003
 > --- lists.erl   Thu Mar 20 17:58:26 2003
 > ***************
 > *** 280,285 ****
 > --- 280,286 ----
 >   thing_to_list(X) when integer(X) -> integer_to_list(X);
 >   thing_to_list(X) when float(X)         -> float_to_list(X);
 >   thing_to_list(X) when atom(X)  -> atom_to_list(X);
 > + thing_to_list(X) when pid(X)   -> pid_to_list(X);
 >   thing_to_list(X) when list(X)  -> X.          %Assumed to be a string
 >
 >   %% flatten(List)
 >

I am sorry, I do not think that is the correct(tm) solution. It seems 
that lists:thing_to_list/1 handles items that look the same in a 
parseable Erlang source file as when printed. Some types that are 
missing are: pid(), port(), reference(), all not parseable from their 
string representation.

So I think it is gen_server:format_status/2 that is faulty, trying to 
call lists:concat/1 with a pid(). See the diff following.

/ Raimo Niskanen, Erlang/OTP




Note that the following diff might not patch as it is since it is not 
from the R9B-1 version of the file.

***************
*** 670,676 ****
   %%-----------------------------------------------------------------
   format_status(Opt, StatusData) ->
       [PDict, SysState, Parent, Debug, [Name, State, Mod, _Time]] = 
StatusData,
!     Header = lists:concat(["Status for generic server ", Name]),
       Log = sys:get_debug(log, Debug, []),
       Specfic =
         case erlang:function_exported(Mod, format_status, 2) of
--- 670,681 ----
   %%-----------------------------------------------------------------
   format_status(Opt, StatusData) ->
       [PDict, SysState, Parent, Debug, [Name, State, Mod, _Time]] = 
StatusData,
!     NameTag = if pid(Name) ->
!                     pid_to_list(Name);
!                atom(Name) ->
!                     Name
!             end,
!     Header = lists:concat(["Status for generic server ", NameTag]),
       Log = sys:get_debug(log, Debug, []),
       Specfic =
         case erlang:function_exported(Mod, format_status, 2) of


 >
 >
 > 	-Vance
 >
 > Vance Shipley
 > Motivity Telecom Inc.
 > +1 519 240 3684
 > 
 >
 > On Thu, Mar 20, 2003 at 04:36:04PM -0500, Vance Shipley wrote:
 > }
 > }  Now the problem is that, at least in R9B-[0|1], this only works if the
 > }  process is registered!  In the following example I am peeking at a
 > }  couple gen_server processes the system runs.  I am referring to each
 > }  by PID but the process which is not registerd fails.
 > ...
 > }  Error in process <0.25.0> with exit value: 
{function_clause,[{lists,thing_to_list,[<0.23.0>]},{lists,flatmap,2},{gen_server,format_status,2},{erl_eval,expr,3},{erl_eval,exprs,4},{shell,eval_loop,2}]}
 > }




Vance Shipley wrote:
> Background
> 
> Both gen_server.erl and gen_fsm.erl have a (undocumented) function 
> which is used to pretty print the persistent data they keep.  The
> way it works is that you first call sys:get_status/1 (documented)
> to retrieve the process's status and then format the state data
> in a contextually relevant way with gen_[server|fsm]:format_status/2.
> The nice thing is that gen_[server|fsm]:format_status/2 will check
> to see if the user's callback module has exported a format_status/2
> and if so it will call that function to get an even more contextually
> relevant way to present the data.  I find this all very handy.
> 
> Problem
> 
> Now the problem is that, at least in R9B-[0|1], this only works if the
> process is registered!  In the following example I am peeking at a 
> couple gen_server processes the system runs.  I am referring to each
> by PID but the process which is not registerd fails.
> 
> 	-Vance
> 
> 
> $ erl
> Erlang (BEAM) emulator version 5.2.3.3 [source] [hipe] [threads:0]
> 
> Eshell V5.2.3.3  (abort with ^G)
> 1> i().
> Pid                   Initial Call                          Heap     Reds Msgs
> Registered            Current Function                     Stack              
> ...
> <0.17.0>              code_server:init/1                     377    46225    0
> code_server           gen_server:loop/6                       12              
> ...
> <0.23.0>              kernel_config:init/1                   233       45    0
>                       gen_server:loop/6                       12              
> ...
> 
> 2> {_,_,_,StatusData} = sys:get_status(list_to_pid("<0.17.0>")),
> 2> gen_server:format_status([], StatusData).
> [{header,"Status for generic server code_server"},
>  {data,[{"Status",running},{"Parent",<0.9.0>},{"Logged events",[]}]},
>  {data,[{"State",
>          {state,"/usr/local/lib/erlang",
>                 [".",
>                  "/usr/local/lib/erlang/lib/kernel-2.8.1.1/ebin",
>                  "/usr/local/lib/erlang/lib/stdlib-1.11.4.1/ebin",
>                  "/usr/local/lib/erlang/lib/webtool-0.7.1/ebin",
>                  "/usr/local/lib/erlang/lib/tv-2.0.4/ebin",
>                  "/usr/local/lib/erlang/lib/tools-2.2/ebin",
>                  "/usr/local/lib/erlang/lib/toolbar-1.1.0/ebin",
>                  "/usr/local/lib/erlang/lib/ssl-2.3.5/ebin",
>                  "/usr/local/lib/erlang/lib/snmp-3.3.8/ebin",
>                  "/usr/local/lib/erlang/lib/sasl-1.9.4/ebin",
>                  "/usr/local/lib/erlang/lib/runtime_tools-1.3/ebin",
>                  "/usr/local/lib/erlang/lib/pman-2.4.1/ebin",
>                  "/usr/local/lib/erlang/lib/parsetools-1.2/ebin",
>                  "/usr/local/lib/erlang/lib/os_mon-1.6.0.2/ebin",
>                  "/usr/local/lib/erlang/lib/orber-3.4/ebin",
>                  "/usr/local/lib/erlang/lib/observer-0.9.3/ebin",
>                  "/usr/local/lib/erlang/lib/mnesia_session-1.1.5/ebin"|...],
>                 9,
>                 10,
>                 interactive}}]}]
> 3> f(StatusData).
> ok
> 4> {_,_,_,StatusData} = sys:get_status(list_to_pid("<0.23.0>")),
> 4> gen_server:format_status([], StatusData).
> ** exited: {function_clause,[{lists,thing_to_list,[<0.23.0>]},
>                              {lists,flatmap,2},
>                              {gen_server,format_status,2},
>                              {erl_eval,expr,3},
>                              {erl_eval,exprs,4},
>                              {shell,eval_loop,2}]} **
> 
> =ERROR REPORT==== 20-Mar-2003::16:31:37 ===
> Error in process <0.25.0> with exit value: {function_clause,[{lists,thing_to_list,[<0.23.0>]},{lists,flatmap,2},{gen_server,format_status,2},{erl_eval,expr,3},{erl_eval,exprs,4},{shell,eval_loop,2}]}
> 




More information about the erlang-questions mailing list