gen_server:format_status/2 only works with registered processes

Raimo Niskanen raimo.niskanen@REDACTED
Mon Mar 24 13:52:21 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
> vances@REDACTED
> 
> 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}]}
> }  




More information about the erlang-patches mailing list