J'ai besoin de déboguer du module dans le système étranger. Le module a une fonction publique 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> 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.
-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
4 Réponses :
Voici une truc simple:
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 code>.
La nouvelle variante est Essayez de lancer (42) Catch _: _: Stk -> Stk Fin, Code>
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}]}
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.
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).
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.