inspecting the call stack from a program (was: Re: Extending Functionality: an expedient and questionable approa ch)

Ulf Wiger <>
Wed Mar 19 23:51:26 CET 2003


On Wed, 19 Mar 2003, Chris Pressey wrote:

>I'm currently using this function:
>
>  call_stack() ->
>    {'EXIT', {Error, CallStack}} = (catch 1 = 2),
>    tl(CallStack).

Not that it's necessarily better, but out of curiosity, I
tried to write a program that presented a call stack based
on process_info(Pid,backtrace) (actually, it does have the
nice property that it can be used on any process.)

Interestingly, the (badly written) regexp:first_match() in
the commented version seems to loop endlessly. Bug or
feature? The same pattern passed to egrep works fine.

I cannot guarantee that this version always gives a correct
answer. My "parsing" of the backtrace is sloppy, to say the
least.

/Uffe

all_stack() ->
    {_, Stack} = process_info(self(),backtrace),
    case format(binary_to_list(Stack)) of
        [{?MODULE,call_stack,0}|Tail] ->
            Tail;
        Other ->
            Other
    end.

% format(Str) ->
%     case regexp:first_match(
%
Str,"\\([a-z]+[a-z0-9_]*:[a-z]+[a-z0-9_]*+/[0-9]+") of
%       {match,Start,Length} ->
%           Fun = string:substr(Str,Start+1,Length-1),
%           [M,F,A] = string:tokens(Fun,":/"),
%
[{list_to_atom(M),list_to_atom(F),list_to_integer(A)}|
%            format(string:substr(Str,Start+Length))];
%       nomatch ->
%           []
%     end.

format(Str) ->
    Tokens = string:tokens(Str,"\n "),
    funs(Tokens).

funs(["(" ++ Rest|Toks]) ->
    case string:tokens(Rest,":/") of
        [M,F,A] ->

[{list_to_atom(M),list_to_atom(F),list_to_integer(A)}|
             funs(Toks)];
        _ ->
            funs(Toks)
    end;
funs([_|Toks]) ->
    funs(Toks);
funs([]) ->
    [].



-- 
Ulf Wiger, Senior Specialist,
   / / /   Architecture & Design of Carrier-Class Software
  / / /    Strategic Product & System Management
 / / /     Ericsson AB, Connectivity and Control Nodes




More information about the erlang-questions mailing list