<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>tomqyp</title>
    <description></description>
    <link>http://tomqyp.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>利用运行时性能分析功能调试程序</title>
        <author>tomqyp</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tomqyp.javaeye.com">tomqyp</a>&nbsp;
          链接：<a href="http://tomqyp.javaeye.com/blog/126076" style="color:red;">http://tomqyp.javaeye.com/blog/126076</a>&nbsp;
          发表时间: 2007年09月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">试用一个开源程序，发现程序在一些特定情况会陷入死循环，这种情况下没有调试工具仅凭契约和单元测试也很难找出原因，何况程序本身没有这样的代码，大范围修改也不方便，突然想到用性能分析功能也许可以很容易找到有问题的函数，试了一下没想到性能分析只有在正常退出时才有输出，强行退出并没有结果。</font></p>
<p><font face="Arial">看了一下trace的代码，发现trace的初始化和结果输出分别是在构造和解构中自动调用的，强退时应该没有调用解构所以没有输出，只要在退出于调用一下输出函数应该就行了，于是试着写了一个小测试。</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>extern&nbsp;(C) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;trace_term(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;signal(</span><span class="keyword">int</span><span>,</span><span class="keyword">void</span><span>&nbsp;function(</span><span class="keyword">int</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;</span><span class="keyword">void</span><span>&nbsp;function(</span><span class="keyword">int</span><span>)&nbsp;SigHander; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;onExit(</span><span class="keyword">int</span><span>&nbsp;n) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace_term(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">int</span><span>&nbsp;foo1(</span><span class="keyword">int</span><span>&nbsp;i) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;i++; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">int</span><span>&nbsp;foo2(</span><span class="keyword">int</span><span>&nbsp;i) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;i&nbsp;+=&nbsp;</span><span class="number">2</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">int</span><span>&nbsp;main() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;SigHander&nbsp;sh&nbsp;=&nbsp;&amp;onExit; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;signal(</span><span class="number">2</span><span>,sh); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(</span><span class="keyword">true</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=foo1(i); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;j&nbsp;=&nbsp;</span><span class="number">0</span><span>;j&lt;</span><span class="number">10</span><span>;j++)&nbsp;i&nbsp;=&nbsp;foo2(i); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>运行程序后程序进出死循环，ctrl+c退出，OK有结果了。</p>
<p>如果想方便应该可以直接改phobo或者tango的trace.d文件，不过我试了一下发现windows下并没有把trace编译到phobo中，而是用了dmc的snn.lib，google了一下没找相关的代码，只好就此作罢，linux下的朋友有兴趣可以试试。</p>
          <br/>
          <span style="color:red;">
            <a href="http://tomqyp.javaeye.com/blog/126076#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Sep 2007 01:42:03 +0800</pubDate>
        <link>http://tomqyp.javaeye.com/blog/126076</link>
        <guid>http://tomqyp.javaeye.com/blog/126076</guid>
      </item>
      <item>
        <title>很详细的 D教程</title>
        <author>tomqyp</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tomqyp.javaeye.com">tomqyp</a>&nbsp;
          链接：<a href="http://tomqyp.javaeye.com/blog/87154" style="color:red;">http://tomqyp.javaeye.com/blog/87154</a>&nbsp;
          发表时间: 2007年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          可惜不知道是什么语言写的，当天书看喽。
          <br/>
          <span style="color:red;">
            <a href="http://tomqyp.javaeye.com/blog/87154#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Jun 2007 01:28:00 +0800</pubDate>
        <link>http://tomqyp.javaeye.com/blog/87154</link>
        <guid>http://tomqyp.javaeye.com/blog/87154</guid>
      </item>
      <item>
        <title>ddbi的编译</title>
        <author>tomqyp</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tomqyp.javaeye.com">tomqyp</a>&nbsp;
          链接：<a href="http://tomqyp.javaeye.com/blog/54649" style="color:red;">http://tomqyp.javaeye.com/blog/54649</a>&nbsp;
          发表时间: 2007年02月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚刚接触D，本身功力又不深，所以只能写些应用级的东西，就当是学习笔记了。<br />
ddbi是用D下的一套的数据库接口，支持：
<ul>
    <li><a href="http://www.dsource.org/projects/ddbi/wiki/FreeTDSSubproject" class="wiki">MS SQL Server &amp; Sybase</a> </li>
    <li><a href="http://www.dsource.org/projects/ddbi/wiki/MySQLSubproject" class="wiki">MySQL</a> </li>
    <li><a href="http://www.dsource.org/projects/ddbi/wiki/ODBCSubproject" class="wiki">ODBC</a> </li>
    <li><a href="http://www.dsource.org/projects/ddbi/wiki/PostgreSQLSubproject" class="wiki">PostgreSQL</a> </li>
    <li><a href="http://www.dsource.org/projects/ddbi/wiki/SQLite3Subproject" class="wiki">SQLite 3</a> </li>
</ul>
详细介绍见项目主页 http://www.dsource.org/projects/ddbi<br />
<br />
下载以后解压，根据说明先编译<br />
dmd -run buildme.d all<br />
提示链接时一大堆函数找不到，我用的是tango用黓认库，配置了半天相关参数，没用。<br />
于是干脆用回phobos，再编译<br />
提示找不到bud程序，我的bud文件名是build.exe，要解决有两个办法。<br />
一是将build.exe更名为bud.exe，但是我用的IDE是poseidon，poseidon是调用build.exe进行编译，所以没用这个办法（后来发现当前版本的poseidon可以直接设定bud文件）。<br />
第二个办法是找打开buildme.d找到<br />
&nbsp;if (system(&quot;bud &quot; ~ buildCommand))&nbsp; 将其改为<br />
&nbsp;if (system(&quot;build &quot; ~ buildCommand))<br />
再次编译，还是没通过！！<br />
看提示是找不到win32\odbcinst.d,可以自己写，或者在dsource.org binding项目有个现成的win32项目。<br />
下载解压，再编译，ok<br />
不过提示两个模块要手工编译，不知道为什么，还望高人赐教。
          <br/>
          <span style="color:red;">
            <a href="http://tomqyp.javaeye.com/blog/54649#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 Feb 2007 03:58:00 +0800</pubDate>
        <link>http://tomqyp.javaeye.com/blog/54649</link>
        <guid>http://tomqyp.javaeye.com/blog/54649</guid>
      </item>
  </channel>
</rss>