windbg调试内存泄漏
首先使用windbg工具gflags.exe设置内存启动跟踪内存泄露进程的user stack
启动方法就是运行下面指令gflags.exe /i test.exe +ust
等价于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options,命令“gflags.exe /i test.exe +ust”实际上就是在该路径下创建一个子键“test.exe”并创建一个名为GlobalFlag内容为0x00001000的REG_DWORD值。
使用windbg加载test.exe,运行关闭时windbg中会提示内存泄露
normal block at 0x026A5F98, 4000 bytes long . Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete. |
可以发现地址0x026A5F98就是内存泄漏的地址泄漏4000个字节
通过!heap命令对该地址进行分析可以发现具体的调用堆栈
0:000> !heap -p -a 0x026A5F98 address 026a5f98 found in _HEAP @ 14f0000 HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 026a5f60 01fc 0000 [00] 026a5f78 00fc4 - (busy) 77a1b234 ntdll!RtlAllocateHeap+0x00000274 584d7743 MSVCR100D!_heap_alloc_base+0x00000053 584e5d8c MSVCR100D!_heap_alloc_dbg_impl+0x000001fc 584e5b2f MSVCR100D!_nh_malloc_dbg_impl+0x0000001f 584e5adc MSVCR100D!_nh_malloc_dbg+0x0000002c 584e5a91 MSVCR100D!_malloc_dbg+0x00000021 58694dd6 mfc100ud!operator new +0x00000026 58694e6a mfc100ud!operator new []+0x0000001a 58694768 mfc100ud!operator new []+0x00000018 *** WARNING: Unable to verify checksum for SendMsgEx.exe 2a3c25 SendMsgEx!CSendMsgExDlg::Thread1Proc+0x00000055 767c1174 kernel32!BaseThreadInitThunk+0x0000000e 779fb3f5 ntdll!__RtlUserThreadStart+0x00000070 779fb3c8 ntdll!_RtlUserThreadStart+0x0000001b |
可以发现内存泄漏的地址在CSendMsgExDlg::Thread1Proc这个地址里面调用了new[]导致内存泄漏
DWORD WINAPI CSendMsgExDlg::Thread1Proc(__in LPVOID lpParameter) { INT *pVal = new INT [1000]; //.................. } |
如此即可发现导致内存泄漏的原因和地址!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现