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

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

看了一下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下的朋友有兴趣可以试试。

 

最后整理了一个,只要把下面代码单独存为一个文件,在程序中import 这个文件就可以了,tango phobos 都适用

extern (C)   
{   
    void trace_term();   
    void signal(int,void function(int));   
    alias void function(int) SigHander;   
    void onExit(int n)   
    {   
        trace_term();   
    }   
}

static this()
{
	signal(2,&onExit);  
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值