当前位置:  开发笔记 > 编程语言 > 正文

在Visual Studio中调试多线程程序时"跳过"

如何解决《在VisualStudio中调试多线程程序时"跳过"》经验,为你挑选了3个好方法。

在Visual Studio(我的情况下是2005)中调试程序时,有一件事让我感到恼火的是,当我使用"跳过"(通过按下F10)执行到下一行代码时,我经常最终到达特定的代码行一个完全不同于我所看到的线程.这意味着我所做的所有背景都丢失了.

我该如何解决这个问题?

如果在Visual Studio的更高版本中可以这样做,我也想听听它.

在下一行代码中设置一个断点,它有一个条件只能为这个线程打破,这不是我正在寻找的答案,因为这对我来说太有用了:)



1> Aaron..:

我认为你的问题只有一个答案,你已经打折为"工作太多".但是,我认为这是因为你的方式错误.让我介绍在线程ID上添加条件断点的步骤,这些步骤非常简单,但在您了解它们之前并不明显.

    在你想要继续调试的正确线程中停止调试器(我猜这通常是第一个到达那里的线程).

    进入$TID观察窗口.

    $TID == <从监视窗口添加条件值为$ TID的断点>,
    示例:$TID == 0x000016a0

    继续执行.

$TID是Microsoft编译器的一个神奇变量(至少从Visual Studio 2003开始),它具有当前线程ID的值.它比查看(FS + 0x18)[0x24]更容易.= d

话虽这么说,你可以使用一些简单的宏获得与调试器的一次性断点相同的行为.当您跳过时,调试器在后台设置断点,运行到该断点然后将其删除.如果遇到ANY断点,则一致用户界面的关键是删除这些断点.

以下两个宏为当前线程提供Step OverRun 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及之前进行修改.



2> Evgeny Lazin..:

您可以使用"线程"调试窗口(Ctrl+ Alt+ H)冻结另一个线程或切换到另一个线程.


这也是我正在做的,问题是......为什么一步改变正在执行的线程?

3> 小智..:

调试一个特定线程的简单方法是从Threads窗口冻结所有其他线程.


有没有办法让VS不切换线程?在什么情况下调试器切换到一个不同的线程,当你踩到一条线并期望只是到达下一个线路时甚至是有意义的?
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有