现象是在soak测试场景中,每天以线性关系增长700个句柄。
解决过程如下:
- 重现问题。只要问题能稳定重现,那就很容易解决。这次很幸运,很轻松弄好了重现环境。
- 使用windbg attach到被调试进程。
- 启用操作系统对于句柄栈追踪功能:!htrace -enable。
- 等问题重现以后,使用!htrace -diff来看这两个命令之间所有打开了但还没有被关闭的句柄。
结果令我吃了一惊,从堆栈显示,“泄漏”竟然指向EnterCriticalSection(),这是系统提供的函数,应该不会出错,所以可能是符号表没有正确加载,从而导致堆栈不正确。于是我重新加载应用程序和系统的符号表,再次测试,结果还是一样。于是我突然意识到所谓的“泄漏”可能是虚惊一场,句柄增长的真正原因是CS内部使用的event同步对象延迟创建机制导致的。即每个CS只有在真正有多线程竞争它的时候才初始化内部的内核对象,完成同步工作。
于是经过和测试人员沟通,发现问题场景确实是不断会竞争CS,从而导致event对象不断创建,而且竞争的数量分布也很均匀,符合句柄现行增长的现象。所以问题分析结束。