如何调试无法启动的erlang应用程序
如果我编写一些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。
在某些时候,如果我的代码有错误,我找不到它!
我写了一个对somemodule的调用:functionthatdoesntexists()在一些gen_server的init回调函数中。
所有vm都说“init终止于启动”,然后显示badmatch的错误位置,精简我顶层模块(myapp)的文件和行。
(Badmatch因为ok = application:start(...)将不匹配)。
我查看erl_crash.dump文件,没有关于这个未定义函数的信息(但我在原子列表中找到它)。
所以,我写了一些日志来近似地看到错误的位置,但是接下来我将不得不启动我的gen_servers以获取正确的错误信息。
我错过了什么,我怎么能更快地弄清楚?
谢谢
如果你的应用程序调用了一个未知模块,你的erl_crash.dump
文件将包含这样一行:
41DABB8:t4:A8:nonexistent_module,A7:unknown,N,N
其中该行中的“未知”表示无法找到模块nonexistent_module
。 在erl_crash.dump
文件中搜索字符串“unknown”可以帮助解决这些问题。
如果您怀疑某个模块调用了不存在的函数,则可以在交互式erl外壳程序中使用外部参照工具来找到它。 确保使用调试信息(通常通过erlc +debug_info
)编译模块,然后:
1> xref:m(my_module).
[{deprecated,[]},
{undefined,[{{my_module,init,1},{another_module,unknown,0}}]},
{unused,[]}]
这里, xref
向我们展示了my_module:init/1
函数调用another_module:unknown/0
函数,但unknown/0
函数未在another_module
定义。
您还可以使用xref
来检查整个应用程序; 详细信息请参阅文档
添加-init_debug到你的erl命令:)
链接地址: http://www.djcxy.com/p/38185.html