"Step Over" When Debugging Multithreaded Programs in Visual Studio

Step over when debugging multithreaded programs in Visual Studio

I think there is only one answer to your question, which you have discounted as being 'way too much work.' However, I believe that is because you are going about it the wrong way. Let me present steps for adding a conditional breakpoint on Thread ID, which are extremely easy, but not obvious until you know them.

  1. Stop the debugger at a point where you are in the correct thread you want to continue debugging in (which I would guess is usually the first thread that gets there).

  2. Enter $TID into the watch window.

  3. Add a break point with the condition $TID == <value of $TID from Watch Window>,
    Example: $TID == 0x000016a0

  4. Continue Execution.

$TID is a magic variable for Microsoft compilers (since at least Visual Studio 2003) that has the value of the current Thread ID. It makes it much easier than looking at (FS+0x18)[0x24]. =D

That being said, you can get the same behavior as the debugger's One-Shot breakpoints with some simple macros. When you step over, the debugger, behind the scenes, sets a breakpoint, runs to that breakpoint and then removes it. The key to a consistent user interface is removing those breakpoints if ANY breakpoint is hit.

The following two macros provide Step Over and Run To Cursor for the current thread. This is accomplished in the same manner as the debugger, with the breakpoints being removed after execution, regardless of which breakpoint is hit.

You will want to assign a key combination to run them.

NOTE: One caveat -- The Step Over macro only works correctly if the cursor is on the line you want to step over. This is because it determines the current location by the cursor location, and simply adds one to the line number. You may be able to replace the location calculation with information on the current execution point, though I was unable to locate that information from the Macro IDE.

Here they are and good luck bug hunting!!

To use these macros in Visual Studio:

1. Open the Macro IDE ( from the Menu, select: Tools->Macros->Macro IDE... )

2. Add a new Code File ( from the Menu: select: Project->Add New Item..., choose Code File, and click Add )

3. Paste in this code.

4. Save the file.

To add key combinations for running these macros in Visual Studio:

1. Open Options (from the Menu, select: Tools->Options )

2. Expand to Environment->Keyboard

3. In Show commands containing:, type Macros. to see all your macros.

4. Select a macro, then click in Press shortcut keys:

5. Type the combo you want to use (backspace deletes typed combos)

6. click Assign to set your shortcut to run the selected macro.

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

Disclaimer: I wrote these macros in Visual Studio 2005. You can probably use them fine in Visual Studio 2008. They may require modification for Visual Studio 2003 and before.

Is there a way to debug multithreaded applications in singletreaded mode in Visual Studio?

Is there a way to debug multithreaded applications in singletreaded
mode in Visual Studio?

Just as Dialecticus suggested, you could try these:

Suggestion

1) Use Threads Window

  • first, set a breakpoint at the entry of the main function

  • start debugging and then enter Debug-->Windows-->Threads--> then right-click on the threads that you do not want to debug and then select Freeze. And note that you have to always click on switch to thread, every time something happens.

  • You can refer to this document about using Threads Window.

2) you can try to follow this document to set a new breakpoint about the specific single thread ID to debug it.

3) there is also a vs extension called Debug Single Thread. You can also use it.

Step line when debugging multithreaded application

Windbg's step command p allows you to specify which threads are to continue executing while all the others remain frozen. See http://msdn.microsoft.com/en-us/library/windows/hardware/ff553496(v=vs.85).aspx

Specifically look at the optional [~ Thread] at the beginning of the command.

Visual Studio multithread debugging

it would be of great help if Visual Studio could stop the execution on the exact line where the error occurred.

Visual Studio has an option to automatically break when an exception is thrown. In Vs 2015 it's Debug -> Windows -> Exception Settings. Tick the C++ Exceptions checkbox under the Break When Thrown heading.

This is helpful for figuring out which code is throwing an exception. The drawback is that, if you have code that routinely throws and handles exceptions, you'll have a lot of undesired breaks in the debugger.

Visual Studio, debug one of multiple threads

Yes.

In the Threads window (Debug -> Windows -> Threads) right-click the thread you want and select "switch to thread".

You can also choose "freeze" on the threads you don't want to debug in order to keep them from running. Don't forget to "thaw" them if you expect them to do work, however.

Further reading.

Visual Studio 2015 Debug doesn't work in multithread application

I've experienced similar issues with VS2015 freezing (indefinitely) whilst debugging a multi thread WinForms application.

I had no problems debugging the same code in VS2013.

The problem appears to go away when I disable the VS hosting process (Project -> Properties -> Debug -> Enable the Visual Studio hosting process).

Hope that works for others.

How to debug the debugger of visual studio 2008 when debugging a multi threaded application?

Please see MS Hotfix: Updates for Visual Studio 2008 SP1 debugging and breakpoints



Related Topics



Leave a reply



Submit