在Visual Studio(我的情况下是2005)中调试程序时,有一件事让我感到恼火的是,当我使用"跳过"(通过按下F10)执行到下一行代码时,我经常最终到达特定的代码行一个完全不同于我所看到的线程.这意味着我所做的所有背景都丢失了.
我该如何解决这个问题?
如果在Visual Studio的更高版本中可以这样做,我也想听听它.
在下一行代码中设置一个断点,它有一个条件只能为这个线程打破,这不是我正在寻找的答案,因为这对我来说太有用了:)
我认为你的问题只有一个答案,你已经打折为"工作太多".但是,我认为这是因为你的方式错误.让我介绍在线程ID上添加条件断点的步骤,这些步骤非常简单,但在您了解它们之前并不明显.
在你想要继续调试的正确线程中停止调试器(我猜这通常是第一个到达那里的线程).
进入$TID
观察窗口.
$TID == <
从监视窗口添加条件值为$ TID的断点>
,
示例:$TID == 0x000016a0
继续执行.
$TID
是Microsoft编译器的一个神奇变量(至少从Visual Studio 2003开始),它具有当前线程ID的值.它比查看(FS + 0x18)[0x24]更容易.= d
话虽这么说,你可以使用一些简单的宏获得与调试器的一次性断点相同的行为.当您跳过时,调试器在后台设置断点,运行到该断点然后将其删除.如果遇到ANY断点,则一致用户界面的关键是删除这些断点.
以下两个宏为当前线程提供Step Over和Run To Cursor.这是以与调试器相同的方式完成的,断点在执行后被删除,无论命中哪个断点.
您需要指定一个组合键来运行它们.
注意:一个警告 -如果光标位于您要跳过的行上,则"跳过"宏仅能正常工作.这是因为它通过光标位置确定当前位置,只需在行号中添加一个.您可以使用当前执行点的信息替换位置计算,但我无法从宏IDE中找到该信息.
他们在这里和好运虫狩猎!!
要在Visual Studio中使用这些宏,请执行以下操作:
1.打开宏IDE(从菜单中选择:工具 - >宏 - >宏IDE ...)
2.添加新的代码文件(从菜单中选择:项目 - >添加新项目...,选择代码文件,然后单击添加)
3.粘贴此代码.
4.保存文件.要添加在Visual Studio中运行这些宏的组合键:
1.打开选项(从菜单中选择:工具 - >选项)
2.展开到环境 - >键盘
3.在显示包含:的命令中,键入宏.看到你所有的宏.
4.选择一个宏,然后单击按快捷键:
5.键入要使用的组合(退格键删除键入的组合)
6.单击" 分配"以设置运行所选宏的快捷方式.
Imports System Imports EnvDTE Imports EnvDTE80 Imports System.Diagnostics Public Module DebugHelperFunctions Sub RunToCursorInMyThread() Dim textSelection As EnvDTE.TextSelection Dim myThread As EnvDTE.Thread Dim bp As EnvDTE.Breakpoint Dim bps As EnvDTE.Breakpoints ' For Breakpoints.Add() Dim FileName As String Dim LineNumber As Integer Dim ThreadID As String ' Get local references for ease of use myThread = DTE.Debugger.CurrentThread textSelection = DTE.ActiveDocument.Selection LineNumber = textSelection.ActivePoint.Line FileName = textSelection.DTE.ActiveDocument.FullName ThreadID = myThread.ID ' Add a "One-Shot" Breakpoint in current file on current line for current thread bps = DTE.Debugger.Breakpoints.Add("", FileName, LineNumber, 1, "$TID == " & ThreadID) ' Run to the next stop DTE.Debugger.Go(True) ' Remove our "One-Shot" Breakpoint For Each bp In bps bp.Delete() Next End Sub Sub StepOverInMyThread() Dim textSelection As EnvDTE.TextSelection Dim myThread As EnvDTE.Thread Dim bp As EnvDTE.Breakpoint Dim bps As EnvDTE.Breakpoints ' For Breakpoints.Add() Dim FileName As String Dim LineNumber As Integer Dim ThreadID As String ' Get local references for ease of use myThread = DTE.Debugger.CurrentThread textSelection = DTE.ActiveDocument.Selection LineNumber = textSelection.ActivePoint.Line FileName = textSelection.DTE.ActiveDocument.FullName ThreadID = myThread.ID LineNumber = LineNumber + 1 ' Add a "One-Shot" Breakpoint in current file on current line for current thread bps = DTE.Debugger.Breakpoints.Add("", FileName, LineNumber, 1, "$TID == " & ThreadID) ' Run to the next stop DTE.Debugger.Go(True) ' Remove our "One-Shot" Breakpoint For Each bp In bps bp.Delete() Next End Sub End Module
免责声明:我在Visual Studio 2005中编写了这些宏.您可以在Visual Studio 2008中使用它们.它们可能需要对Visual Studio 2003及之前进行修改.
您可以使用"线程"调试窗口(Ctrl+ Alt+ H)冻结另一个线程或切换到另一个线程.
调试一个特定线程的简单方法是从Threads窗口冻结所有其他线程.