Jor*_*ira 4 windows windbg resource-leak
我想知道是否可以使用 WinDbg 来了解导致句柄分配的调用堆栈。
例如:
#include <windows.h>
#include <conio.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Press ENTER to leak handles." << endl;
_getch();
cout << "Leaking handles" << endl;
for (int i = 0; i < 100; ++i)
{
HANDLE h = CreateEvent(NULL, FALSE, FALSE, NULL);
if (h != NULL)
{
cout << ".";
}
}
cout << "Handles leaked. Press ENTER to exit." << endl;
_getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在构建此示例并在 WinDbg 中启动它之后,是否可以获取分配句柄的调用堆栈,在该行上方的示例中:
HANDLE h = CreateEvent(NULL, FALSE, FALSE, NULL);
Run Code Online (Sandbox Code Playgroud)
我正在查看!handle命令,但到目前为止没有任何进展。
这与处理泄漏分析有关。我知道的!htrace -enable和!htrace -diff,但是这是一个不同的使用场景(除非有某种方式来组合或其它使用矢量,请提供相关资料)。
找到了似乎是一个解决方案:
!htrace -enable!htrace <handle>0:001> !htrace -启用 句柄跟踪已启用。 处理跟踪信息快照成功拍摄。 0:001> 克 0:001> !handle ... 手柄7d8 类型事件 ... 111把手 类型计数 事件 103 文件 3 端口 1 目录 2 窗口站 1 键控事件 1 0:001> !htrace 7d8 ------------------------------- 句柄 = 0x000007d8 - 打开 线程 ID = 0x00000fc4,进程 ID = 0x000017a8 0x0040106d:TestMemHandleLeak!wmain+0x0000006d 0x0040151b:TestMemHandleLeak!__tmainCRTStartup+0x0000010f 0x7c817077: kernel32!BaseProcessStart+0x00000023 ------------------------------- 解析 0x64 堆栈跟踪。 转储 0x1 堆栈跟踪。
为了获得该地址的代码行,我做了:
0:001> ln TestMemHandleLeak!wmain+0x0000006d f:\temp\windowsapplication3\testmemhandleleak\testmemhandleleak.cpp(22)
| 归档时间: |
|
| 查看次数: |
707 次 |
| 最近记录: |