WinDBG查找C++句柄泄露

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

C++代码(频仍点击About按钮导致Mutex句柄泄露)
  1. HANDLE _mutexHandle;
  2. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  3. {
  4.     switch (message)
  5.     {
  6.     case WM_COMMAND:
  7.         {
  8.             int wmId = LOWORD(wParam);
  9.             // 分析菜单选择:
  10.             switch (wmId)
  11.             {
  12.             case IDM_ABOUT:
  13.                 _mutexHandle = CreateMutex(NULL, FALSE, L"abc");
  14.                 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  15.                 break;
  16.             case IDM_EXIT:
  17.                 DestroyWindow(hWnd);
  18.                 break;
  19.             default:
  20.                 return DefWindowProc(hWnd, message, wParam, lParam);
  21.             }
  22.         }
  23.         break;
  24.     case WM_PAINT:
  25.         {
  26.             PAINTSTRUCT ps;
  27.             HDC hdc = BeginPaint(hWnd, &ps);
  28.             // TODO: 在此处添加使用 hdc 的任何绘图代码...
  29.             EndPaint(hWnd, &ps);
  30.         }
  31.         break;
  32.     case WM_DESTROY:
  33.         PostQuitMessage(0);
  34.         break;
  35.     default:
  36.         return DefWindowProc(hWnd, message, wParam, lParam);
  37.     }
  38.     return 0;
  39. }
复制代码
编译后生成exe程序,设置WinDBG的源码目录和pdb目录:
File-->Settings-->

 File-->Start debugging
选择目标exe文件启动进程,点击左上角Go按钮,让ui显式,点击Break按钮让进程暂停,在WinDBG的下令行输入:
!htrace -enable
!htrace -snapshot
点击WinDBG左上角的Go按钮继续实行,点击UI上的按钮造成泄露;
点击WinDBG左上角的Break按钮进入调试模式;
在下令行输入:
!htrace 或 !htrace -diff,查看句柄泄露信息:
  1. 0:006> !htrace -diff
  2. Handle tracing information snapshot successfully taken.
  3. 0x1a new stack traces since the previous snapshot.
  4. Ignoring handles that were already closed...
  5. Outstanding handles opened since the previous snapshot:
  6. --------------------------------------
  7. Handle = 0x00000000000002c0 - OPEN
  8. Thread ID = 0x000000000000172c, Process ID = 0x0000000000003d7c
  9. 0x00007ffac544eb64: ntdll!NtCreateMutant+0x0000000000000014
  10. 0x00007ffac2d38fa8: KERNELBASE!CreateMutexExW+0x0000000000000058
  11. 0x00007ff6436c6f00: CPPWindowsProject1!WndProc+0x00000000000000d0
  12. 0x00007ffac50cef5c: USER32!UserCallWinProcCheckWow+0x000000000000050c
  13. 0x00007ffac50ce684: USER32!DispatchMessageWorker+0x0000000000000494
  14. 0x00007ff6436c1d57: CPPWindowsProject1!wWinMain+0x0000000000000117
  15. 0x00007ff6436c2c62: CPPWindowsProject1!invoke_main+0x0000000000000032
  16. 0x00007ff6436c2b12: CPPWindowsProject1!__scrt_common_main_seh+0x0000000000000132
  17. 0x00007ff6436c29ce: CPPWindowsProject1!__scrt_common_main+0x000000000000000e
  18. 0x00007ff6436c2cfe: CPPWindowsProject1!wWinMainCRTStartup+0x000000000000000e
  19. 0x00007ffac37e7374: KERNEL32!BaseThreadInitThunk+0x0000000000000014
  20. 0x00007ffac53fcc91: ntdll!RtlUserThreadStart+0x0000000000000021
  21. --------------------------------------
  22. Handle = 0x00000000000002bc - OPEN
  23. Thread ID = 0x000000000000172c, Process ID = 0x0000000000003d7c
  24. 0x00007ffac544eb64: ntdll!NtCreateMutant+0x0000000000000014
  25. 0x00007ffac2d38fa8: KERNELBASE!CreateMutexExW+0x0000000000000058
  26. 0x00007ff6436c6f00: CPPWindowsProject1!WndProc+0x00000000000000d0
  27. 0x00007ffac50cef5c: USER32!UserCallWinProcCheckWow+0x000000000000050c
  28. 0x00007ffac50ce684: USER32!DispatchMessageWorker+0x0000000000000494
  29. 0x00007ff6436c1d57: CPPWindowsProject1!wWinMain+0x0000000000000117
  30. 0x00007ff6436c2c62: CPPWindowsProject1!invoke_main+0x0000000000000032
  31. 0x00007ff6436c2b12: CPPWindowsProject1!__scrt_common_main_seh+0x0000000000000132
  32. 0x00007ff6436c29ce: CPPWindowsProject1!__scrt_common_main+0x000000000000000e
  33. 0x00007ff6436c2cfe: CPPWindowsProject1!wWinMainCRTStartup+0x000000000000000e
  34. 0x00007ffac37e7374: KERNEL32!BaseThreadInitThunk+0x0000000000000014
  35. 0x00007ffac53fcc91: ntdll!RtlUserThreadStart+0x0000000000000021
  36. --------------------------------------
  37. Handle = 0x00000000000002b8 - OPEN
  38. Thread ID = 0x000000000000172c, Process ID = 0x0000000000003d7c
  39. 0x00007ffac5450d84: ntdll!NtTraceControl+0x0000000000000014
  40. 0x00007ffac53f2f86: ntdll!EtwpRegisterProvider+0x00000000000000ba
  41. 0x00007ffac53f30e5: ntdll!EtwNotificationRegister+0x00000000000000a5
  42. 0x00007ffac53f2ea0: ntdll!EtwEventRegister+0x0000000000000020
  43. 0x00007ffac36ec5ef: MSCTF!TraceLoggingRegisterEx_EventRegister_EventSetInformation+0x0000000000000053
  44. 0x00007ffac36ec579: MSCTF!wil::TraceLoggingProvider::Register+0x0000000000000019
  45. 0x00007ffac36e46b4: MSCTF!wil::details::static_lazy<CtfTraceLoggingTelemetry>::get+0x0000000000000094
  46. 0x00007ffac36e460c: MSCTF!CtfTraceLoggingTelemetry::IsEnabled+0x0000000000000010
  47. 0x00007ffac36e42ac: MSCTF!CtfTraceLoggingTelemetry::InputSessionStarted<unsigned short (&)[41],unsigned long &,_GUID &,_GUID &,unsigned short &,bool &,unsigned long &,unsigned long &,unsigned long &,bool &,unsigned long,bool &>+0x0000000000000034
  48. 0x00007ffac36e40b8: MSCTF!CInputSessionMgr::UpdateInputSession+0x0000000000000338
  49. 0x00007ffac36f378b: MSCTF!SYSTHREAD::RouteKeyToInputService+0x0000000000000103
  50. 0x00007ffac36f33f1: MSCTF!SYSTHREAD::OnKeyboardEvent+0x00000000000000d1
  51. --------------------------------------
  52. Handle = 0x00000000000002b4 - OPEN
  53. Thread ID = 0x000000000000172c, Process ID = 0x0000000000003d7c
  54. 0x00007ffac5450d84: ntdll!NtTraceControl+0x0000000000000014
  55. 0x00007ffac53f2f86: ntdll!EtwpRegisterProvider+0x00000000000000ba
  56. 0x00007ffac53f30e5: ntdll!EtwNotificationRegister+0x00000000000000a5
  57. 0x00007ffac53f2ea0: ntdll!EtwEventRegister+0x0000000000000020
  58. 0x00007ffac46f261f: ole32!InitializeTracing+0x000000000000016f
  59. 0x00007ffac4709727: ole32!DllMain+0x0000000000000033
  60. 0x00007ffac470650f: ole32!dllmain_dispatch+0x000000000000008f
  61. 0x00007ffac53c9a1d: ntdll!LdrpCallInitRoutine+0x0000000000000061
  62. 0x00007ffac541d2f7: ntdll!LdrpInitializeNode+0x00000000000001d3
  63. 0x00007ffac541d08a: ntdll!LdrpInitializeGraphRecurse+0x0000000000000042
  64. 0x00007ffac53ed947: ntdll!LdrpPrepareModuleForExecution+0x00000000000000bf
  65. 0x00007ffac53cfbae: ntdll!LdrpLoadDllInternal+0x000000000000019a
  66. --------------------------------------
  67. Handle = 0x00000000000002b0 - OPEN
  68. Thread ID = 0x000000000000172c, Process ID = 0x0000000000003d7c
  69. 0x00007ffac5450d84: ntdll!NtTraceControl+0x0000000000000014
  70. 0x00007ffac53f2f86: ntdll!EtwpRegisterProvider+0x00000000000000ba
  71. 0x00007ffac53f30e5: ntdll!EtwNotificationRegister+0x00000000000000a5
  72. 0x00007ffac53f2ea0: ntdll!EtwEventRegister+0x0000000000000020
  73. 0x00007ffac46f25b3: ole32!InitializeTracing+0x0000000000000103
  74. 0x00007ffac4709727: ole32!DllMain+0x0000000000000033
  75. 0x00007ffac470650f: ole32!dllmain_dispatch+0x000000000000008f
  76. 0x00007ffac53c9a1d: ntdll!LdrpCallInitRoutine+0x0000000000000061
  77. 0x00007ffac541d2f7: ntdll!LdrpInitializeNode+0x00000000000001d3
  78. 0x00007ffac541d08a: ntdll!LdrpInitializeGraphRecurse+0x0000000000000042
  79. 0x00007ffac53ed947: ntdll!LdrpPrepareModuleForExecution+0x00000000000000bf
  80. 0x00007ffac53cfbae: ntdll!LdrpLoadDllInternal+0x000000000000019a
  81. --------------------------------------
  82. Handle = 0x00000000000002ac - OPEN
  83. Thread ID = 0x000000000000172c, Process ID = 0x0000000000003d7c
  84. 0x00007ffac5450d84: ntdll!NtTraceControl+0x0000000000000014
  85. 0x00007ffac53f2f86: ntdll!EtwpRegisterProvider+0x00000000000000ba
  86. 0x00007ffac53f30e5: ntdll!EtwNotificationRegister+0x00000000000000a5
  87. 0x00007ffac53f2aaa: ntdll!EtwRegisterTraceGuidsW+0x000000000000009a
  88. 0x00007ffac46f2564: ole32!InitializeTracing+0x00000000000000b4
  89. 0x00007ffac4709727: ole32!DllMain+0x0000000000000033
  90. 0x00007ffac470650f: ole32!dllmain_dispatch+0x000000000000008f
  91. 0x00007ffac53c9a1d: ntdll!LdrpCallInitRoutine+0x0000000000000061
  92. 0x00007ffac541d2f7: ntdll!LdrpInitializeNode+0x00000000000001d3
  93. 0x00007ffac541d08a: ntdll!LdrpInitializeGraphRecurse+0x0000000000000042
  94. 0x00007ffac53ed947: ntdll!LdrpPrepareModuleForExecution+0x00000000000000bf
  95. 0x00007ffac53cfbae: ntdll!LdrpLoadDllInternal+0x000000000000019a
  96. --------------------------------------
  97. Handle = 0x0000000000000298 - OPEN
  98. Thread ID = 0x000000000000388c, Process ID = 0x0000000000003d7c
  99. 0x00007ffac544dc74: ntdll!NtDuplicateObject+0x0000000000000014
  100. 0x00007ffac2d6b37c: KERNELBASE!DuplicateHandle+0x000000000000004c
  101. 0x00007ffac35b0e03: RPCRT4!THREAD::THREAD+0x0000000000000087
  102. 0x00007ffac35b0d58: RPCRT4!ThreadSelfHelper+0x0000000000000028
  103. 0x00007ffac35c5850: RPCRT4!RpcpSetThreadpoolCallbackInstance+0x0000000000000050
  104. 0x00007ffac35d1343: RPCRT4!PerformGarbageCollection+0x0000000000000023
  105. 0x00007ffac5422719: ntdll!TppTimerpExecuteCallback+0x00000000000000a9
  106. 0x00007ffac53fd79a: ntdll!TppWorkerThread+0x000000000000068a
  107. 0x00007ffac37e7374: KERNEL32!BaseThreadInitThunk+0x0000000000000014
  108. 0x00007ffac53fcc91: ntdll!RtlUserThreadStart+0x0000000000000021
  109. --------------------------------------
  110. Handle = 0x0000000000000294 - OPEN
  111. Thread ID = 0x000000000000388c, Process ID = 0x0000000000003d7c
  112. 0x00007ffac544ddf4: ntdll!NtCreateEvent+0x0000000000000014
  113. 0x00007ffac2d66dfb: KERNELBASE!CreateEventW+0x000000000000006b
  114. 0x00007ffac35b2bc5: RPCRT4!EVENT::EVENT+0x000000000000002d
  115. 0x00007ffac35b0da6: RPCRT4!THREAD::THREAD+0x000000000000002a
  116. 0x00007ffac35b0d58: RPCRT4!ThreadSelfHelper+0x0000000000000028
  117. 0x00007ffac35c5850: RPCRT4!RpcpSetThreadpoolCallbackInstance+0x0000000000000050
  118. 0x00007ffac35d1343: RPCRT4!PerformGarbageCollection+0x0000000000000023
  119. 0x00007ffac5422719: ntdll!TppTimerpExecuteCallback+0x00000000000000a9
  120. 0x00007ffac53fd79a: ntdll!TppWorkerThread+0x000000000000068a
  121. 0x00007ffac37e7374: KERNEL32!BaseThreadInitThunk+0x0000000000000014
  122. 0x00007ffac53fcc91: ntdll!RtlUserThreadStart+0x0000000000000021
  123. --------------------------------------
  124. Handle = 0x0000000000000280 - OPEN
  125. Thread ID = 0x000000000000172c, Process ID = 0x0000000000003d7c
  126. 0x00007ffac544eb64: ntdll!NtCreateMutant+0x0000000000000014
  127. 0x00007ffac2d38fa8: KERNELBASE!CreateMutexExW+0x0000000000000058
  128. 0x00007ff6436c6f00: CPPWindowsProject1!WndProc+0x00000000000000d0
  129. 0x00007ffac50cef5c: USER32!UserCallWinProcCheckWow+0x000000000000050c
  130. 0x00007ffac50ce684: USER32!DispatchMessageWorker+0x0000000000000494
  131. 0x00007ff6436c1d57: CPPWindowsProject1!wWinMain+0x0000000000000117
  132. 0x00007ff6436c2c62: CPPWindowsProject1!invoke_main+0x0000000000000032
  133. 0x00007ff6436c2b12: CPPWindowsProject1!__scrt_common_main_seh+0x0000000000000132
  134. 0x00007ff6436c29ce: CPPWindowsProject1!__scrt_common_main+0x000000000000000e
  135. 0x00007ff6436c2cfe: CPPWindowsProject1!wWinMainCRTStartup+0x000000000000000e
  136. 0x00007ffac37e7374: KERNEL32!BaseThreadInitThunk+0x0000000000000014
  137. 0x00007ffac53fcc91: ntdll!RtlUserThreadStart+0x0000000000000021
  138. --------------------------------------
  139. Displayed 0x9 stack traces for outstanding handles opened since the previous snapshot.
复制代码
代码中构造的mutex泄露,查找!htrace -diff输出内容,找到CPPWindowsProject1!WndProc+0x00000000000000d0
使用lsa CPPWindowsProject1!WndProc+0x00000000000000d0查看代码,如下:

  1.    143:             {
  2.    144:             case IDM_ABOUT:
  3.    145:                 //_condition_variable = new std::condition_variable();
  4.    146:                 //_mutex = new std::mutex();
  5. >  147:                 _mutexHandle = CreateMutex(NULL, FALSE, L"abc");
  6.    148:                 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  7.    149:                 break;
  8.    150:             case IDM_EXIT:
  9.    151:                 DestroyWindow(hWnd);
  10.    152:                 break;
复制代码
找到147行的代码位置。
windbg的lsa指令:显式指令对应的源码 




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表