<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dialyzer on cnDenis的笔记</title><link>https://blog.cndenis.com/tags/Dialyzer.html</link><description>Recent content in Dialyzer on cnDenis的笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 01 Aug 2013 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.cndenis.com/tags/Dialyzer/index.xml" rel="self" type="application/rss+xml"/><item><title>Erlang的静态代码检查</title><link>https://blog.cndenis.com/Erlang/2013/08/Erlang%E7%9A%84%E9%9D%99%E6%80%81%E4%BB%A3%E7%A0%81%E6%A3%80%E6%9F%A5.html</link><pubDate>Thu, 01 Aug 2013 00:00:00 +0000</pubDate><guid>https://blog.cndenis.com/Erlang/2013/08/Erlang%E7%9A%84%E9%9D%99%E6%80%81%E4%BB%A3%E7%A0%81%E6%A3%80%E6%9F%A5.html</guid><description>&lt;p&gt;Dialyzer是Erlang的静态代码检查程序, 可以发现函数调用时的类型错误之类的问题,
以及被调用的函数不存在或未导出的问题. 最实用的是在上传代码到SVN后,
检查是否漏传模块. 因为漏传的话, 编译不会报错, 但运行时会出undef错误,
从SVN上检出一份全新的代码, 用Dialyzer查一下, 漏的马上可以发现.&lt;/p&gt;
&lt;p&gt;Dialyzer用法很简单, 只有三步: 建立PLT文件, 编译代码, 运行检查.&lt;/p&gt;
&lt;h2 id="建立plt文件"&gt;建立PLT文件
&lt;/h2&gt;&lt;p&gt;PLT文件是Dialyzer所用的代码规则的记录, 或者说是索引.
一般把代码所用到的几个常用的Erlang系统库加到PLT文件中就好了.&lt;/p&gt;
&lt;p&gt;开始使用Dialyzer之前请先确定Erlang已正确安装, dialyzer.exe在系统搜索路径中.&lt;/p&gt;
&lt;p&gt;写Dialyzer模块的人用的是Linux, 所以这东西对Windows不是特别友好,
它的PLT文件默认存放在HOME目录下, 而Windows一般是没有这个环境变量的,
所以Dialyzer一运行就报错. 因此首先要设置HOME变量, 指定为一个目录,
用以存放PLT文件.&lt;/p&gt;
&lt;p&gt;建立PLT文件的命令是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dialyzer --build_plt --apps erts kernel stdlib mnesia
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其实 &lt;code&gt;--build_plt&lt;/code&gt; 参数表示建立PLT文件,
&lt;code&gt;--app&lt;/code&gt; 后面写上代码中引用到的内置库即可.&lt;/p&gt;
&lt;p&gt;这个命令运行时间比较长, 可能达到十几分钟, 请去喝杯咖啡慢慢等.&lt;/p&gt;
&lt;p&gt;如果发现已经建立的PLT文件中漏了某些库, 可以使用 &lt;code&gt;--add_to_plt&lt;/code&gt; 添加.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dialyzer --build_plt --apps eunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其实一不用加太多, 最常用的就上面几个, 检查代码时如果发现漏了, 再用
&lt;code&gt;--add_to_plt&lt;/code&gt; 加上即可.&lt;/p&gt;
&lt;h2 id="编译代码"&gt;编译代码
&lt;/h2&gt;&lt;p&gt;Dialyzer可以检查源代码erl文件, 也可以检查编译好的beam文件.
我推荐是检查beam文件, 速度比较快.&lt;/p&gt;
&lt;p&gt;用Dialyzer检查beam文件要求在编译beam文件时加上debug_info参数,
这样生成出来的beam才能用于dialyzer检查.&lt;/p&gt;
&lt;h2 id="运行检查"&gt;运行检查
&lt;/h2&gt;&lt;p&gt;对于编译好的beam文件, 只需要进入beam所在目录, 运行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dialyzer .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;即可检查该目录下所有beam文件, 或是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dialyzer 文件名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;即可检查某一文件.&lt;/p&gt;
&lt;p&gt;如果希望把结果写入一个文件中, 可以使用&lt;code&gt;-o&lt;/code&gt;参数, 如:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dialyzer . -o Result.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样会把结果写入&lt;code&gt;Result.txt&lt;/code&gt;中.&lt;/p&gt;</description></item></channel></rss>