5

監視ツリーを構築するためのerlangコードを記述し、次のコマンドを使用して起動時にアプリケーションを起動すると、それが機能しない理由を見つけるのが非常に難しい場合があります。

erl -s myapp -pa ebin ... ...

(myappサンプルモジュール)

-module(myapp).
-export([start/0]).
start() -> application:start(myapp).

私のアプリがスーパーバイザーmyapp_supを起動するとします。myapp_supは、順番に複数のスーパーバイザー(たとえば、server_sup、database_sup、another_sup)を起動します。

これらのスーパーバイザーは、いくつかのgen_serversを起動します。

ある時点で、私のコードに間違いがあった場合、私はそれを見つけることができません!

いくつかのgen_serverのinitコールバックでsomemodule:functionthatdoesntexists()の呼び出しを作成しました。

すべてのVMは、「initはdo bootで終了します」と言ってから、不一致のエラーの場所、正確なファイル、および最上位モジュール(myapp)の行を表示します。

(ok = application:start(...)が一致しないため、不一致)。

erl_crash.dumpファイルを調べましたが、この未定義の関数に関する情報はありません(ただし、アトムリストにあります)。

そこで、エラーがどこにあるかを概算するためにログを作成しましたが、正しいエラー情報を取得するには、gen_serversを手動で起動する必要があります。

私は何が欠けていますか、どうすればそれをより速く理解できますか?

ありがとう

4

2 に答える 2

2

erlコマンドに-init_debugを追加します:)

于 2013-01-25T00:45:54.720 に答える
2

アプリケーションが不明なモジュールを呼び出す場合、erl_crash.dumpファイルには次のような行が含まれます。

41DABB8:t4:A8:nonexistent_module,A7:unknown,N,N

ここで、行の「不明」は、モジュールnonexistent_moduleが見つからないことを示します。このような場合は、ファイルで「不明」という文字列を検索するerl_crash.dumpと役立ちます。

特定のモジュールが存在しない関数を呼び出していると思われる場合は、インタラクティブなerlシェルの外部参照ツールを使用して見つけることができます。モジュールをデバッグ情報(通常はを介してerlc +debug_info)でコンパイルしてから、次のことを確認してください。

1> xref:m(my_module).
[{deprecated,[]},
 {undefined,[{{my_module,init,1},{another_module,unknown,0}}]},
 {unused,[]}]

ここでは、関数が関数を呼び出しているが、関数がで定義されていないxrefことを示しています。my_module:init/1another_module:unknown/0unknown/0another_module

xrefアプリケーション全体をチェックするために使用することもできます。詳細については、ドキュメントを参照してください

于 2013-01-25T14:09:58.373 に答える