加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

debugging – 如何调试无法启动的erlang应用程序

发布时间:2020-12-15 20:59:16 所属栏目:安全 来源:网络整理
导读:如果我编写一些erlang代码来构建监督树,然后在启动时使用以下命令启动应用程序,则可能很难找出它为什么不起作用: erl -s myapp -pa ebin ... ... (myapp示例模块) -module(myapp).-export([start/0]).start() - application:start(myapp). 假设我的应用程序
如果我编写一些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).

Theese监督员将推出一些gen_servers.

在某些时候,如果我的代码中有错误,我找不到它!

我写了一些调用somemodule:functionthatdoesntexists()在一些gen_server的init回调中.

所有vm说的是“init终止在do boot中”,然后显示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 shell中使用the xref tool找到它.确保使用调试信息(通常通过erlc debug_info)编译模块,然后:

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

这里,外部参照向我们展示了my_module:init / 1函数调用another_module:unknown / 0函数,但未知/ 0函数未在another_module中定义.

您还可以使用外部参照来检查整个应用程序;详见the documentation

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读