2007-09-22

利用运行时性能分析功能调试程序

关键字: 调试 性能分析

试用一个开源程序,发现程序在一些特定情况会陷入死循环,这种情况下没有调试工具仅凭契约和单元测试也很难找出原因,何况程序本身没有这样的代码,大范围修改也不方便,突然想到用性能分析功能也许可以很容易找到有问题的函数,试了一下没想到性能分析只有在正常退出时才有输出,强行退出并没有结果。

看了一下trace的代码,发现trace的初始化和结果输出分别是在构造和解构中自动调用的,强退时应该没有调用解构所以没有输出,只要在退出于调用一下输出函数应该就行了,于是试着写了一个小测试。

java 代码
  1. extern (C)   
  2. {   
  3.     void trace_term();   
  4.     void signal(int,void function(int));   
  5.     alias void function(int) SigHander;   
  6.     void onExit(int n)   
  7.     {   
  8.         trace_term();   
  9.     }   
  10. }   
  11.   
  12. int foo1(int i)   
  13. {   
  14.     return i++;   
  15. }   
  16. int foo2(int i)   
  17. {   
  18.     return i += 2;   
  19. }   
  20. int main()   
  21. {   
  22.     SigHander sh = &onExit;   
  23.     signal(2,sh);   
  24.     int i=0;   
  25.     while(true)   
  26.     {   
  27.         i=foo1(i);   
  28.         for(int j = 0;j<10;j++) i = foo2(i);   
  29.     }   
  30.  return 0;   
  31. }   
  32.   

运行程序后程序进出死循环,ctrl+c退出,OK有结果了。

如果想方便应该可以直接改phobo或者tango的trace.d文件,不过我试了一下发现windows下并没有把trace编译到phobo中,而是用了dmc的snn.lib,google了一下没找相关的代码,只好就此作罢,linux下的朋友有兴趣可以试试。

评论
tomqyp 2007-09-23
windows下比较麻烦,tango我没测试,不过看了一下也没有编译到tango库中而是编译到了dmd.lib中,这个库不知道在什么情况下链接会引用这个库.而linux下phobo到是编译进了相关的函数,打个小补丁应该就可以了.
oldrev 2007-09-23
用 diff 做个补丁给 tango
DavidL 2007-09-23
思路很有新意。搞定tango,windows就可以分享给大家用了
发表评论

您还没有登录,请登录后发表评论

tomqyp
搜索本博客
博客分类
我的相册
4a46b09e-1305-44ef-8151-ed74684bc9ff-thumb
TangoTeam
共 3 张
最近加入圈子
存档
最新评论