erlang中如何调试程序】的更多相关文章

学习一门语言,当学习那些基本语法的时候,我们常常会忽略它的程序调试,当程序稍微复杂一点的时候,我们不能保证程序的完全正确,我们会为其发愁,这时,程序的调试就变得相当重要了.    在erlang环境搭建好之后,它会默认自带一个调试的工具---erlang debugger(这个名字起得很好(^_^)).    Erlang debugger的简单使用:    假设我们有一个写好的test.erl.    1.编译模块.编译模块的时候,应该这样编译c(test,[debug_info]).   …
erlang中错误大体分为四种: 1. 编译错误    2. 逻辑错误    3. 运行时错误    4. 用户代码生成的错误 编译错误,主要是编译器检测出的代码语法错误 逻辑错误,是指程序没有完成预期的工作,属于开发人员的问题 运行时错误,是指erlang运行时抛出的错误,比如对非数据类型执行算术运算,erlang运行时会捕获异常,并抛出.在erlang中,这类异常的类型为error 用户自定义错误,是指通过exit/1或者throw/1生成 我们把运行时错误以及用户抛出的错误称为异常(exc…
Erlang的原子(atom)在匹配中有着重要作用,它兼顾了可读性和运行效率. 通过atom,可以实现很多灵活高效的应用. atom可以看作是给字符串生成了一个ID,内部使用的是ID值,必要时可以取出它的内容(字符串),例如用于打印输出. atom 的 Eterm 除去 6 位的标签之外剩下的部分,就是 atom 在 Erlang 虚拟机中的索引,也就是一个整数值.在 Erlang 中,有关 atom 比较的操作只需要比较两个索引值即可,就是整数操作,因此非常高效.atom 本身是一个字符串,那…
一. erlang中的错误 1. 分类 1) 编译错误:主要是编译器检测出的代码语法错误: 2) 逻辑错误:是指程序没有完成预期的工作,属于开发人员的问题: 3) 运行时错误:是指erlang运行时抛出的错误,比如对非数据类型执行算术运算,erlang运行时会捕获异常,并抛出.在erlang中,这类异常的类型为error: 4) 用户代码生成的错误:是指通过exit/1或者throw/1生成. 2. 异常 我们把运行时错误以及用户抛出的错误称为异常(exception),他们具有三种类型:thr…
转自: http://www.kongqingquan.com/archives/208#more-208 Erlang中的atom由通用hash表实现,虚拟机中atom最终的用数值表示,对应表中的下标值.本文通过list_to_atom函数的实现,分析atom在虚拟机中的内部实现.先看atom的数据结构: $OTP/erts/emulator/beam/atom.h typedef struct atom { IndexSlot slot; /* 必须放到结构体顶部,通用hash表时用到!!!…
转自: http://www.cnblogs.com/zhengsyao/p/3424539.html 在 Erlang 中,使用 atom 既方便又高效,我们就来看看 atom 是怎么实现的.atom 的 Eterm 除去 6 位的标签之外剩下的部分,就是 atom 在 Erlang 虚拟机中的索引,也就是一个整数值.在 Erlang 中,有关 atom 比较的操作只需要比较两个索引值即可,就是整数操作,因此非常高效.atom 本身是一个字符串,那么 atom 的索引是怎样对应上具体的字符串的…
现在我们看看UDP协议(User Datagram Protocol,用户数据报协议).使用UDP,互联网上的机器之间可以互相发送小段的数据,叫做数据报.UDP数据报是不可靠的,这意味着如果客户端发送一系列的UDP数据报到服务器,收到的数据报顺序可能是错误的.不过收到的数据报肯定是正确的.大的数据报会被分为多个小的分片,IP协议负责重新组装这些分片,并最终交付给应用. UDP是无连接的协议,这意味着客户端无需连接服务器即可发送消息.这也意味着程序更加适于大量客户端收发小的消息报文. 在Erlan…
转自:http://www.thinksaas.cn/group/topic/244329/ 功能说明: erlang中对各种语言的编码支持不足,此代码是使用erlang驱动了著名的iconv编码库来对字符进行编码转换处理. 文件说明: iconv_erl.c和iconv.h 是erlang字符编码模块的driver,作用是对iconv进行封装.编译后生成iconv_erl.dll,供iconv.erl使用. iconv_makefile.win32 windows上编译iconv_erl.dl…
http://blog.sina.com.cn/s/blog_96b8a1540101317g.html 一.基本概念 在Erlang中,通过两个概念管理错误事情:事件管理器(event manager)和事件处理句柄(event handles).通常各种错误.警告和消息事件都会有Erlang运行时系统发送给事件管理器.在Erlang中,默认的事情管理器为error logger,其进程名注册为error_logger.默认情况下error_logger把这些事件直接输出到控制台上. 在系统启…
http://erlangdisplay.iteye.com/blog/315452 _开头(包括_)在erlang可以是表明,这个变量可以存任意东西,就是我们常说的全匹配,_A一般来说就是表明这个东西我拉出来了,是某某东西,但是我没用到,这一般就用_A,A就是要么就绑定变量,要么就匹配变量咯,这要视乎A有否被绑定过而定. 唯一的区别就是_A你下面没调用 make的时候不会报warnning如果是A下面没调用 make的时候会报warrning就这样,_A和_基本上一样的,都是不打算处理或者没有…
http://avindev.iteye.com/blog/76373 注:这篇文章可能会有争议,欢迎提出意见 在Erlang中,如果要实现两个远程节点之间的通信,就需要通过网络来实现,对于消息发送,是使用TCP.如果要在两个节点间频繁发送消息,比如每秒几百上千条,那样就要注意了. 无论是网游服务器开发的书籍,或是经验老道的工程师,都会告诉你,在发送数据包时,尽可能把小的消息组合为一个比较大的包来发送,毕竟一个TCP包的头也很大,首先是浪费带宽,其次调用底层发送的指令也是有开销的.有工程师告诉我…
http://www.cnblogs.com/me-sa/archive/2011/07/20/erlang0006.html 在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据项顺序调整或者增减字段,都容易出现badmatch. 同时一些常量如果硬编码到代码中,一旦数值变化,要想全部可靠的替换成新的数值是一个困难的事情. 这两种数据层面的变化,在Erlang中对应的解决方案是: record  Macro record   在代码中我们创建一个record:   -rec…
唔,听说过这四个牛逼渣渣的behaviour:gen_server,gen_fsm,gen_event,supervisor.所以也就更加好奇behaviour的实现. 在解释它是怎么工作的之前,我们可以先看一个具体的实现.这可能会帮助我们理解. 我们先定义一个behaviour:   -module(my_behaviour). -export([behaviour_info/1]). -export([start/1, stop/0]). behaviour_info(callbacks)…
这儿例举出若干个用于检视运行时系统的图形化工具,这些工具可以很好地帮助我们增进对系统的理解.借助这些工具,我们可以很好地以图形化方式观察进程.应用和监督层级. (1) Appmon.Appmon 是用来监视 OTP 应用的工具.它可以按照图形化方式展示系统中当前正在运行的应用及其监督结构:可以查看进程的当前状态:还可以针对这些进程执行一些基本的操作.启动 Appmon 的命令如下 1>appmon:start (2)WebTool 版 Appmon.多数情况下,我们的服务器都没有安装图像界面,这…
1..app文件中 {application,backend,[  {description,"ebank backend"},  {vsn,1.0},  {modules,[]},  {applications,[kernel,stdlib,yaws]},  {registered,[backend]},  {env,[{env,development}]},  {mod,backend_bootstrap},  {controllers,[    {{"backend&q…
最近项目内存占用过多,检查一下erlang的内存使用情况. 1. 通过etop可以很方便得出erlang内存使用的情况 spawn(fun() -> etop:start([{output, text}, {interval, 5}, {lines, 20}, {sort, memory}]) end). 可以定义显示的时间.行数.按照内存使用的大小排列. 2.一般情况etop都能很稳定地工作,但个别极端情况下,etop会使用不了.这个情况下,只能上命令: RawList = [{Pid, el…
在程序中,难免用的二进制和十进制之间的转换.遇到一个场景,通过ip和子网掩码,计算地址范围. 而地址范围为:网络地址+1—— 广播地址 -1 .  网络地址即ip和子网掩码的与的位运算.广播地址为:网络地址的主机位全部换成1. 打个比方: IP为: 192.168.0.0 /16 ,这里,/16表示前16为是网络位,后16位是主机位. 子网掩码为:255.255.255.0/24,这里,/24表示前24位是网络位,后8位是主机位. 要求得:地址范围,首先就需求出网络地址和广播地址.进而涉及到二进…
问题如题,这是在一个群里问的一个的问题.其实就是http的Server的上传下载的功能.  ibrowse:start().ibrowse:send_req("http://img1.gtimg.com/12/1293/129340/12934049_980x1200_0.jpg", [], get, [], [{save_response_to_file, true}]).如正常返回: 也可以自行指定目标文件保存路径:ibrowse:send_req("http://img…
读<Erlang OTP并发编程实战>中看到这么一句话,遂做笔记以记录: 宏不是函数的替代品,当你所需的抽象无法用普通函数来实现时,宏给出了一条生路,比如,必须确保在编译期展开某些代码的时候,或是在语法不允许执行函数调用的时候. 对于后者做了测试如下: -module(test). -export([test/2]). test(X, Y) -> if maxxx(X, Y) -> X; true -> Y end. maxxx(X, Y) -> X > Y. 此…
首先打开shell,然后在打开cmd输入:erl -sname bilbo  这样就启动了一个gandal的erlang节点. 如图:…
lists:foldl(fun(),参数1,参数2):这个函数就是先把参数1传给fun()处理,然后将参数2(列表)中每一个元素,依次传给fun()函数进行处理. lists:foldl(fun(Elem, AccIn) ->   [B,C] = string:tokens(Elem, "="),   [{list_to_integer(B),list_to_integer(C)}|AccIn] end, [],   string:tokens("1=2,3=4,5=6…
Link and Monitor differences 原文地址 Introduction link/1 and monitor/2 are 2 different ways of notifying (or know) that a process died. Thing is, these are really very different in nature and these differences are not widely understood by beginners. So…
转自: http://blog.sina.com.cn/s/blog_53a5047b01018yqv.html 例子 结果 atom_to_list(hello). "hello" list_to_atom("hello"). hello binary_to_list(<<"hello">>). "hello" binary_to_list(<<104,101,108,108,111>…
需求:要想在一个调度中,从mongo中查出大于一个时间戳的所有的数据总和. 这个需求很简单,一个是scheduler,还有另一个就是查出来大于某个时间戳的总和,比如大于每天0点时间点的和. 需要注意的是:mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间,我们是+8时区,也就是时差相差8,所以+8小时就是系统当前时间. 举个栗子: %% 获取当天的0点时间戳 %% GMT时间(格林尼治时间)比北京时间少8小时 get…
一个参数的方法是已知Pid判断进程是否存活.两个参数的方法是已知节点和Pid或进程名判断进程是否存活. is_process_alive(Pid) when is_pid(Pid)->rpc:call(node(Pid),erlang,is_process_alive,[Pid]);is_process_alive(_Pid)->false. is_process_alive(undefined,_ProcName)->false;is_process_alive(_Node,undef…
例:有这么一个列表,A = [["abc","bds",3],["ssdss","dddx",2],["sfa","ww",4],["wad","ffx",0]]. 需求为:对最后一位取出列表中的最大值. 处理它的基本思想为:截取.遍历.取最大值. 这里有个listA,每个list中有N个元素,这个为3个,对最后一位取列表A中的最大值,操作如下:…
timer:tc/3对于统计函数运行时间是个很不错的函数, 截图timer:tc/1,tc/2,tc/3的API: 拿斐波那契数列入手做个讲解: -module(fib). -export([fib/1]). fib(0) -> 0; fib(1) -> 1; fib(N) when N>1 -> fib(N-1) + fib(N-2). 对于统计运行时间,直接上图: 这里的355000为MincSeconds. 注意:这是统计从1到30,斐波那契函数运行的总时间. 若要使变通下,…
在erlang里'_'是一个特殊的变量(其实erlang里不应该叫“变”量,照顾习惯,姑且这么叫吧),它可以代替任何东西,在match的时候非常有用,例如: {A, _, [B|_], {B}} = {abc, 23, [22, 23], {22}} 这样,就是把_当作一个占位符,表示,match的时候这里有一个值,但是我不关心他是什么 在erlang里,使用下划线'_'开头的变量名是有特殊含义的,除了当作普通的变量使用(binding,match,compute,compare,etc)以外,…
在使用VS2017 XAMARIN调试Android应用程序时,屏幕闪一下,进入不了调试(使用谷歌的模拟器可以调试,但是太慢), 我们现在来解决一下这个问题. 第一步:打开Hyper-V管理器 第二步:关闭微软模拟器及虚拟机 第三步:设置虚拟机的处理器属性,见下图 最后点击确定,重新打开微软模拟器,在VS2017下做断点调试就OK了.…
RSA签名校验 -spec check_rsa_sign(DataBin, Sign, RSAPublicKeyBin, DigestType) -> boolean when DataBin :: binary(), Sign :: binary(), RSAPublicKeyBin :: binary() DigestType :: 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' | 'sha512'. check_rsa_sign(DataBi…