Erlang的静态代码检查
Dialyzer是Erlang的静态代码检查程序, 可以发现函数调用时的类型错误之类的问题, 以及被调用的函数不存在或未导出的问题. 最实用的是在上传代码到SVN后, 检查是否漏传模块. 因为漏传的话, 编译不会报错, 但运行时会出undef错误, 从SVN上检出一份全新的代码, 用Dialyzer查一下, 漏的马上可以发现.
Dialyzer用法很简单, 只有三步: 建立PLT文件, 编译代码, 运行检查.
建立PLT文件
PLT文件是Dialyzer所用的代码规则的记录, 或者说是索引. 一般把代码所用到的几个常用的Erlang系统库加到PLT文件中就好了.
开始使用Dialyzer之前请先确定Erlang已正确安装, dialyzer.exe在系统搜索路径中.
写Dialyzer模块的人用的是Linux, 所以这东西对Windows不是特别友好, 它的PLT文件默认存放在HOME目录下, 而Windows一般是没有这个环境变量的, 所以Dialyzer一运行就报错. 因此首先要设置HOME变量, 指定为一个目录, 用以存放PLT文件.
建立PLT文件的命令是
dialyzer --build_plt --apps erts kernel stdlib mnesia
其实 --build_plt
参数表示建立PLT文件,
--app
后面写上代码中引用到的内置库即可.
这个命令运行时间比较长, 可能达到十几分钟, 请去喝杯咖啡慢慢等.
如果发现已经建立的PLT文件中漏了某些库, 可以使用 --add_to_plt
添加.
dialyzer --build_plt --apps eunit
其实一不用加太多, 最常用的就上面几个, 检查代码时如果发现漏了, 再用
--add_to_plt
加上即可.
编译代码
Dialyzer可以检查源代码erl文件, 也可以检查编译好的beam文件. 我推荐是检查beam文件, 速度比较快.
用Dialyzer检查beam文件要求在编译beam文件时加上debug_info参数, 这样生成出来的beam才能用于dialyzer检查.
运行检查
对于编译好的beam文件, 只需要进入beam所在目录, 运行
dialyzer .
即可检查该目录下所有beam文件, 或是
dialyzer 文件名
即可检查某一文件.
如果希望把结果写入一个文件中, 可以使用-o
参数, 如:
dialyzer . -o Result.txt
这样会把结果写入Result.txt
中.
blog comments powered by Disqus