您的位置:首页 > 编程语言

让多线程调试更简单的宏代码---FreezeThawThreads

2010-03-18 14:44 627 查看
多线程程序的调试是一件比较麻烦的事,在我的这篇博文里介绍了两个方便多线程调试的特性(一个是VS特性,一个是John Robbin的InterestingThread宏),今天我再来介绍John Robbin的另一个宏。如果你希望在调试多线程程序时只运行一个线程,而将其它的线程全部暂时Freeze掉,请尝试使用FreezeThawThreads宏。John Robbin原文帖出来的宏代码有一些排版的错误,导致不能编译通过,我已经做了修改,下面是可以编译通过的代码版本:

FreezeThawThreads

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'' Wintellect Debugging Code
'' Copyright © 1997-2009 John Robbins
'            -- All rights reserved.
'' Freeze and thaw threads in bulk.
''
'' Version 1.0 - July 17, 2009
'' - Initial version.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Text
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Public Module FreezeThawThreads
Public Sub FreezeAllButActiveThread()
Dim dbg As EnvDTE90.Debugger3 = CType(DTE.Debugger, Debugger3)
If dbg.CurrentMode = dbgDebugMode.dbgBreakMode Then
Dim currProg As Program = dbg.CurrentProgram
For Each t As Thread2 In currProg.Threads
If (t.ID <> dbg.CurrentThread.ID) Then
If t.IsFrozen = False Then
t.Freeze()
End If
End If
Next
Else
NotInBreakMode()
End If
End Sub
Public Sub ThawAllFrozenThreads()
Dim dbg As EnvDTE90.Debugger3 = CType(DTE.Debugger, Debugger3)
If dbg.CurrentMode = dbgDebugMode.dbgBreakMode Then
Dim currProg As Program = dbg.CurrentProgram
For Each t As Thread2 In currProg.Threads
If t.IsFrozen = True Then
t.Thaw()
End If
Next
Else
NotInBreakMode()
End If
End Sub
Private Sub NotInBreakMode()
MessageBox.Show(New MainWindow(), "You mustbe stopped in the debugger for this macro to work", "Wintellect Thread Freeze/Thaw Macros", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Sub
' A helper class so I can parent  message boxes correctly on the IDE.
Class MainWindow
Implements IWin32Window
Public ReadOnly Property Handle() _
As System.IntPtr Implements IWin32Window.Handle
Get
' The HWnd property    is undocumented.
Dim ret As IntPtr = CType(DTE.MainWindow.HWnd, IntPtr)
Return (ret)
End Get
End Property
End Class
End Module
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: