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中.