9

外部システムでいくつかのモジュールをデバッグする必要があります。モジュールにはパブリック関数がありますfoo()- 指定されたモジュールが呼び出された場所 (モジュールと関数名) を知るにはどうすればよいですか? 私は呼び出しのスタックを意味します。

システムを停止できません。すべての作業は、このモジュールをリロードすることで実行できます (ただし、いくつかのデバッグ情報が必要です)。

-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

4 に答える 4

20

簡単なトリックは次のとおりです。

Trace = try throw(42) catch 42 -> erlang:get_stacktrace() end,
erlang:display(Trace)
于 2010-02-12T15:31:53.947 に答える
3

これはうまくいくかもしれません:

where_am_i() ->
    try throw(a)
    catch throw:a:Stacktrace ->
            Stacktrace
    end.

末尾呼び出しでは機能しないことを除いて。たとえば、次の2つの関数があるとします。

foo() ->
    where_am_i().

bar() ->
    X = where_am_i(),
    {ok, X}.

私はこれらの結果を得る:

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}]}

つまり、が呼び出されたときにの呼び出しフレームがすでに残っているbarため、私はしか見ることができません。foowhere_am_i

于 2010-02-12T15:32:27.143 に答える
2
io:format("~s~n", [要素(2, process_info(self(), バックトレース))])。

self() は他の任意の pid に置き換えることができます (rpc:pinfo はリモート プロシージャでも動作するはずです)。これは、ソースまたはビームを変更することさえできない場合に役立ちます。

于 2010-02-12T23:01:49.390 に答える