How to debug a single thread in Visual Studio?

后端 未结 10 1572
执笔经年
执笔经年 2020-11-28 17:59

I have a solution with some projects. There are several break-points in different projects. I want to trace the first thread hit one of these break-points and continue traci

相关标签:
10条回答
  • 2020-11-28 18:12

    Here's what I did:

    1. Set a conditional break point that I knew would only hit on the thread that I was looking for.

    2. Once the breakpoint hits and you are in the thread you want, in the Visual Studio Threads window (while debugging, Debug -> Windows -> Threads), Ctrl + A (to select all threads), and then Ctrl + click the thread you are currently on. You should have all threads except the one you want to debug selected.

    3. Right-click, and choose "Freeze".

    Now, Visual Studio will only step through the thawed thread. It seems to be much slower when doing this, presumably because it has to loop through all of the frozen threads, but it brought some sanity to my multi-threaded debugging.

    0 讨论(0)
  • 2020-11-28 18:13

    Set a Breakpoint Condition by right clicking the side bar of the line. Select "Condition" and enter the following with the name of your thread in quotes:

    System.Threading.Thread.CurrentThread.Name=="name_of_your_thread"

    Alternatively you can do the same by getting the thread's "Managed ID" from the "Threads" Window and use:

    System.Threading.Thread.CurrentThread.ManagedThreadId==your_managed_thread_id

    0 讨论(0)
  • 2020-11-28 18:14

    Freeze/Thaw threads is an incorrect way because other threads don't execute any code.

    The most correct and usable way is to:

    1. Hit Ctrl+A in the breakpoints window (select all breakpoints).
    2. Right click and select "Filter...".
    3. Enter "ThreadId=(current thread id)".

    In Visual Studio 2015 and newer, the process is similar:

    1. Hit Ctrl+A in the breakpoints window (select all breakpoints).
    2. Right click and select "Settings...".
    3. Check "Conditions" and select "Filter" in the dropdown
    4. Enter "ThreadId=(current thread id)".

    So all threads are executed, but the debugger hits on the current thread only.

    0 讨论(0)
  • 2020-11-28 18:14

    If multiple threads are being spawned as for a web application, @MattFaus answer's will not work. what I did instead is the following

    • Set up a breakpoint to interrupt the thread in the function I want.
    • Once the thread gets to the breakpoint and is paused, I remove the breakpoint and continue debugging using F8,F10 and F11, so that the others threads can run.
    0 讨论(0)
  • 2020-11-28 18:19

    I have just released a Visual Studio 2010+ extension that does exactly what you are looking for. And it's free :).

    Presentation

    This Visual Studio extension adds two shortcuts and toolbar buttons to allow developers to easily focus on single threads while debugging multi-threaded applications.

    It dramatically reduces the need to manually go into the Threads window to freeze/thaw all threads but the one that needs to be followed, and therefore helps improve productivity.

    Features

    Restrict further execution to the current thread only. Will freeze all other threads. Shortcut: CTRL+T+T or Snowflake button. Switch to the next single thread (based on ID). Will change current thread and freeze all other threads. Shortcut: CTRL+T+J or Next button.

    Check it out here on the Gallery, on the official page or the Github repository.

    0 讨论(0)
  • 2020-11-28 18:27

    I think this is slightly different in Visual Studio 2015. They've changed a few things in the breakpoints, but here's how to apply the accepted answer from hzdbyte (above):

    On the breakpoint in the coding margin, Right-Click > Conditions > Change from 'Conditional Expression' to 'Filter'. This then allows you to filter by ThreadId.

    Alternatively on the breakpoint in the Breakpoints window, Right-Click > Settings > tick the Conditions box and do the above.

    0 讨论(0)
提交回复
热议问题