试用一个开源程序,发现程序在一些特定情况会陷入死循环,这种情况下没有调试工具仅凭契约和单元测试也很难找出原因,何况程序本身没有这样的代码,大范围修改也不方便,突然想到用性能分析功能也许可以很容易找到有问题的函数,试了一下没想到性能分析只有在正常退出时才有输出,强行退出并没有结果。
看了一下trace的代码,发现trace的初始化和结果输出分别是在构造和解构中自动调用的,强退时应该没有调用解构所以没有输出,只要在退出于调用一下输出函数应该就行了,于是试着写了一个小测试。
java 代码
- extern (C)
- {
- void trace_term();
- void signal(int,void function(int));
- alias void function(int) SigHander;
- void onExit(int n)
- {
- trace_term();
- }
- }
- int foo1(int i)
- {
- return i++;
- }
- int foo2(int i)
- {
- return i += 2;
- }
- int main()
- {
- SigHander sh = &onExit;
- signal(2,sh);
- int i=0;
- while(true)
- {
- i=foo1(i);
- for(int j = 0;j<10;j++) i = foo2(i);
- }
- return 0;
- }
运行程序后程序进出死循环,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); }