标签: erlang-shell

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

如果我编写了一些 erlang 代码来构建一个监督树,然后使用以下命令在引导时启动应用程序,可能很难找出为什么它不起作用:

erl -s myapp -pa ebin ... ...
Run Code Online (Sandbox Code Playgroud)

(myapp 示例模块)

-module(myapp).
-export([start/0]).
start() -> application:start(myapp).
Run Code Online (Sandbox Code Playgroud)

假设我的应用程序启动了一个主管 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 以获取正确的错误信息。

我错过了什么,我怎么能更快地弄清楚?

谢谢

debugging erlang erlang-otp erlang-shell

5
推荐指数
1
解决办法
1217
查看次数

短路Erlang端口映射器守护程序

给定远程Beam.smp服务的已知TCP端口和名称以及已知的cookie,可以短路Erlang分发协议的Erlang Port Mapper Daemon握手阶段,并直接建立到目标Beam的Erlang Shell .smp服务?

该协议记录在这里:

http://erlang.org/doc/apps/erts/erl_dist_protocol.html

和这里:

https://github.com/blackberry/Erlang-OTP/blob/master/lib/kernel/internal_doc/distribution_handshake.txt

但是我不清楚是否通过Erlang Port Mapper守护程序或绑定到特定端口的beam.smp服务进行recv_challenge / send_challenge身份验证。

感谢您的时间。

erlang erlang-shell erlang-driver

5
推荐指数
1
解决办法
725
查看次数

如何让 ANSI 转义序列在 Erlang Werl 中工作?

Windows 7 x64 上的 Erlang R17.0 x64。

当我clear在一个 werl 窗口中键入时,我看到显示的 ANSI 转义序列。我也试过 --clear()相同的结果。从我的挖掘看来,werl 应该能够处理 ANSI 转义序列。我需要做些什么才能让它工作吗?

erlang erlang-shell

5
推荐指数
0
解决办法
200
查看次数

为什么shell中这两个erlang表达式序列的输出不同?

在Erlang shell中为什么以下产生不同的结果?

1> Total=15.    
2> Calculate=fun(Number)-> Total=2*Number end.
3> Calculate(6).   
Run Code Online (Sandbox Code Playgroud)

异常错误:右侧值12不匹配

1> Calculate=fun(Number)-> Total=2*Number end.
2> Total=15.
3> Calculate(6). 
Run Code Online (Sandbox Code Playgroud)

12

erlang erlang-shell

5
推荐指数
1
解决办法
83
查看次数

如何连接运行在网络中不同主机上的两个 Erlang 节点?

我有两台使用 LAN 电缆连接的 Linux 机器。每台机器都可以 ping 另一台机器。机器 A 在其以太网 eth0 上具有 IP:192.168.137.1。机器 B 在其以太网 eth0 上具有 IP:192.168.137.2。

在机器 A 的终端上:

ping 192.168.137.2
Run Code Online (Sandbox Code Playgroud)

返回回复,B 上的 Wireshark 能够捕获传入的 ping。

在机器 B 的终端上:

ping 192.168.137.1
Run Code Online (Sandbox Code Playgroud)

返回回复,A 上的 Wireshark 能够捕获传入的 ping。

因此,我们在 A 和 B 之间建立了完全连接。

现在,我怎样才能让两个 Erlang shell,一个在 A 上运行,另一个在 B 上运行,能够相互 ping/交谈?如果有人可以通过提供详细的步骤来帮助我实现这一目标,那就太好了。我一直在搜索论坛和浏览文档,但到目前为止,我还没有让它工作。我能找到的所有工作都是在同一台主机上的两个节点之间进行通信。

erlang ping erlang-shell

5
推荐指数
1
解决办法
1385
查看次数

erlang shell 模块功能帮助

我正在 shell 中工作,我想查看该函数的帮助io:format/1

我的思考路径是这样的:

  1. 执行help()- 我找到命令m().
  2. 执行- 我看到模块m(io)中的函数列表io

问题:io:format/1如何从 erlang Shell深入查找该函数的帮助?


输出来自help().

1> help().
...
m(Mod)     -- information about module <Mod>
memory()   -- memory allocation information
...
true
Run Code Online (Sandbox Code Playgroud)

输出来自m(io).

2> m(io).
Module io compiled: Date: July 10 2013, Time: 10.46
Compiler options:  [{outdir,"/build/buildd/erlang-16.b.1-dfsg/lib/stdlib/src/../ebin"},
                    {i,"/build/buildd/erlang-16.b.1-dfsg/lib/stdlib/src/../include"},
                    {i,"/build/buildd/erlang-16.b.1-dfsg/lib/stdlib/src/../../kernel/include"},
                    warnings_as_errors,debug_info]
Object file: /usr/lib/erlang/lib/stdlib-1.19.2/ebin/io.beam
Exports: 
columns/1                     parse_erl_form/2
columns/0                     parse_erl_form/3
format/1                      parse_erl_form/4
format/2                      printable_range/0
format/3                      put_chars/2
...
parse_erl_exprs/4             setopts/2
parse_erl_exprs/3             setopts/1
parse_erl_form/1 …
Run Code Online (Sandbox Code Playgroud)

erlang erlang-shell

4
推荐指数
1
解决办法
1680
查看次数

NIF调用Erlang后二进制更改的值

我打算使用NIF操作二进制文件用于我计划在Erlang中编码的应用程序.下面给出了指向cpp文件的gist链接和NIF的erl文件.

[Erl Gist Link] https://gist.github.com/abhijitiitr/3a5bc97184d6dd32f97b

[C++ Gist Link] https://gist.github.com/abhijitiitr/24d2b780f2cdacebfb07

基本上我正在尝试做一个简单的测试.在NIF调用之间共享二进制文件,并使用连续的NIF调用成功操作它们.

如果你在erlang REPL中测试代码

c(binary_test).
Ref=binary_test:open(<<1>>).
binary_test:increment(Ref,<<3>>).
Run Code Online (Sandbox Code Playgroud)

存储的二进制文件在NIF调用之间发生变化.第三个命令的REPL输出是

1
 3
  60
    60
      <<"?">>
Run Code Online (Sandbox Code Playgroud)

<<1>>在初始化阶段通过了.它为什么改为<<60>>?我无法弄清楚这里发生了什么.有人可以指出错误吗?

C++编译指令

clang++ -std=c++11 -stdlib=libc++ -undefined dynamic_lookup -O3 -dynamiclib binary_test.cpp -o binary_test.so -I /usr/local/Cellar/erlang/17.0/lib/erlang/erts-6.0/include/ 
Run Code Online (Sandbox Code Playgroud)

在我的Mac上.

此外,我想问一下在NIF中操作共享资源的并发进程.这是可能的还是有一个规则,即必须在单个Erlang进程中访问NIF.

c erlang erlang-shell c++11 erlang-nif

4
推荐指数
1
解决办法
377
查看次数

在erlang进程之间发送消息:Atoms vs Binaries

当我将原子作为信息发送时,原子是否从一个过程复制到另一个过程?我的想法是,因为这个原子已经存在于VM中,所以不必复制.我知道从一个进程发送到另一个进程时二进制文件更有效.

如果我发送一个触发器消息,从一个进程到另一个进程的常量消息,最好使用:atom或binary?

erlang mnesia elixir erlang-shell

4
推荐指数
1
解决办法
181
查看次数

4
推荐指数
1
解决办法
1053
查看次数

Erlang选择接收机制的细节是什么?

我在文末读过一篇关于Erlang select receive机制的文章,有一个结论:“消息从邮箱移动到保存队列,然后在匹配的消息到达后返回到邮箱”。我已经尝试过文章中显示的示例,但无法得到相同的结果。这是我的代码,我的 erlang/otp 版本是 21。

shell1:
(aaa@HW0003727)1> register(shell, self()).
true
(aaa@HW0003727)2> shell ! c, shell ! d.
d
(aaa@HW0003727)3> process_info(whereis(shell),messages).
{messages,[c,d]}.
(aaa@HW0003727)4> receive a -> 1; b -> 2 end.


shell2:
(aaa@HW0003727)1> process_info(whereis(shell),messages).
{messages,[c,d]}
(aaa@HW0003727)2> process_info(whereis(shell)).          
[{registered_name,shell},
 {current_function,{prim_eval,'receive',2}},
 {initial_call,{erlang,apply,2}},
 {status,waiting},
 {message_queue_len,2},
 {links,[<0.113.0>]},
 {dictionary,[]},
 {trap_exit,false},
 {error_handler,error_handler},
 {priority,normal},
 {group_leader,<0.112.0>},
 {total_heap_size,4212},
 {heap_size,1598},
 {stack_size,30},
 {reductions,13906},
 {garbage_collection,[{max_heap_size,#{error_logger => true,kill => true,size => 0}},
                      {min_bin_vheap_size,46422},
                      {min_heap_size,233},
                      {fullsweep_after,65535},
                      {minor_gcs,1}]},
 {suspending,[]}]
Run Code Online (Sandbox Code Playgroud)

文章。

erlang erlang-otp erlang-shell

4
推荐指数
1
解决办法
102
查看次数