如果我编写了一些 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 以获取正确的错误信息。
我错过了什么,我怎么能更快地弄清楚?
谢谢
给定远程Beam.smp服务的已知TCP端口和名称以及已知的cookie,可以短路Erlang分发协议的Erlang Port Mapper Daemon握手阶段,并直接建立到目标Beam的Erlang Shell .smp服务?
该协议记录在这里:
http://erlang.org/doc/apps/erts/erl_dist_protocol.html
和这里:
但是我不清楚是否通过Erlang Port Mapper守护程序或绑定到特定端口的beam.smp服务进行recv_challenge / send_challenge身份验证。
感谢您的时间。
Windows 7 x64 上的 Erlang R17.0 x64。
当我clear在一个 werl 窗口中键入时,我看到显示的 ANSI 转义序列。我也试过 --clear()相同的结果。从我的挖掘看来,werl 应该能够处理 ANSI 转义序列。我需要做些什么才能让它工作吗?
在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
我有两台使用 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/交谈?如果有人可以通过提供详细的步骤来帮助我实现这一目标,那就太好了。我一直在搜索论坛和浏览文档,但到目前为止,我还没有让它工作。我能找到的所有工作都是在同一台主机上的两个节点之间进行通信。
我正在 shell 中工作,我想查看该函数的帮助io:format/1。
我的思考路径是这样的:
help()- 我找到命令m(). 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) 我打算使用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.
当我将原子作为信息发送时,原子是否从一个过程复制到另一个过程?我的想法是,因为这个原子已经存在于VM中,所以不必复制.我知道从一个进程发送到另一个进程时二进制文件更有效.
如果我发送一个触发器消息,从一个进程到另一个进程的常量消息,最好使用:atom或binary?
Learn some Erlang或IEx如何为 REPL shell 着色?是谢尔稳定的直接替代?
我在文末读过一篇关于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 ×10
erlang-shell ×10
elixir ×2
erlang-otp ×2
c ×1
c++11 ×1
debugging ×1
erlang-nif ×1
mnesia ×1
ping ×1