9
votes

Comment montrer une pile d'appels erlang?

J'ai besoin de déboguer du module dans le système étranger. Le module a une fonction publique foo () code> - Comment puis-je savoir le lieu (module et nom de la fonction) De quels module FOO () a été appelé? Je veux dire pile d'appels.

Je ne peux pas arrêter le système, tous les travaux que je peux faire en rechargez ce module (mais avec des informations de débogage). P>

-module(given).
-export(foo/0).

foo() ->
    %% here is my debug - and
    %% i need here(!) known about unknown_module:unknown_foo!
    ok.

---
-module(unknown_module).
..

unknown_foo() ->
    given:foo().  %% see above


2 commentaires

J'ai modifier mon exemple, veuillez commenter


Veuillez noter que dans un cas comme votre exemple ci-dessus, l'appel à donner: FOO () est un appel de la queue - cela signifie qu'il n'y aura pas de trace de celui-ci sur la pile (par définition). Si vous avez besoin de faire ce type de débogage, vous devriez en apprendre davantage sur le traçage à Erlang.


4 Réponses :


20
votes

Voici une truc simple: xxx


2 commentaires

Belle tour mais quand j'ai essayé, j'ai eu une erreur de compilation Erlang: get_stacktrace / 0: obsolète; Utilisez la nouvelle syntaxe ESSAY / CATCH pour récupérer la pile BackTrace .


La nouvelle variante est Essayez de lancer (42) Catch _: _: Stk -> Stk Fin,



3
votes

Cela pourrait fonctionner:

4> foo:foo().
[{foo,where_am_i,0},
 {erl_eval,do_apply,5},
 {shell,exprs,6},
 {shell,eval_exprs,6},
 {shell,eval_loop,3}]
5> foo:bar().
{ok,[{foo,where_am_i,0},
     {foo,bar,0},
     {erl_eval,do_apply,5},
     {shell,exprs,6},
     {shell,eval_exprs,6},
     {shell,eval_loop,3}]}


0 commentaires

2
votes
io:format("~s~n", [element(2, process_info(self(), backtrace))]).
self() can be replaced by any other pid (rpc:pinfo should even work with remote procs). This helps if you cannot even modify the source or beam.

0 commentaires

1
votes

Voici mon code pour faire ceci:

format_stack_entry(S) ->
    {Module,Fun,Arity,[{file,File},{line,Line}]}=S,
    io_lib:format("{~p,~p,~p,[{file,~p},{line,~p]}",[Module,Fun,Arity,File,Line]).
stacktop([Top|_]) ->
    Top.
ancestor(N) ->
    {_,Stacktrace}=erlang:process_info(self(),current_stacktrace),
    ancestor(N+1,Stacktrace).
ancestor(1,S) ->
    format_stack_entry(stacktop(S));
ancestor(N,[_|T]) ->
    ancestor(N-1,T).

info(Format)      -> io:format(lists:concat([ancestor(2),Format,"\r"])).
info(Format,Args) -> io:format(lists:concat([ancestor(2),Format,"\r"]),Args).


0 commentaires