构造最小重现用例,执行,出现问题,用调试器查看,查看代码,不得其解.
于是使用gflags工具(非google的那个开源的处理命令行参数的库),用法可参考:
1 官方文档: https://msdn.microsoft.com/en-us/library/ff549557.aspx
2 网友博客: http://www.cnblogs.com/cswuyg/archive/2011/09/27/gflags.html
如以上资料所述,执行:
1 命令行执行: "gflags /p /enable mysqld.exe /full /unaligned",
2 然后重新启动MySQL的服务器,因mysqld.exe被监测,弹出一个窗口提示可能存在内存问题, 属于启动阶段,非bug所示处,忽略,让程序继续运行. 注意:这个过程很快,几乎没有时间损耗.
3 执行测试用例,问题重现,但gflags工具没有给出有用的提示.没有定位到问题所在.
4 放弃使用gflags,禁止其监测mysqld.执行: "gflags /p /disable mysqld.exe"
5 重新启动MySQL的服务器mysqld.exe. mysqld很长时间没有反应,似乎停滞了
6 打开Windows的"任务管理器->进程",看到mysqld进程存在,但"内存"一列的数字在不断增长,说明操作系统在为此进程不断分配内存. 这表明mysqld没有死掉.但是速度缓慢实在无法忍受.
7 执行"regedit"打开注册表,去除"HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/Image File Execution Options"项.
8 重新执行第五步,mysqld很快启动,内存分配瞬间完成.
9 返回头重新阅读代码,整理其逻辑关系.发现问题并解决之--异常情况下多次释放对象造成内存错误,非gflags所能捕获之错误(非本篇小记主题,不表).
10 小结: 使用gflags特别注意第七步,除了第四步放弃监控外,还要注意注册表的清理才能完全做到进程监控的失效.