how to properly track thread in Visual Studio 2013? - c#

Situation:
I'm currently debugging an application which has many threads. I put a debugger points in my code, and at this points I know I have 10 threads and everything is fine. However on the 5 fifth step, my application crashes.
Problem:
I'd like to know if that is possible when my code is stop, to monitors every thread which make a step? So I can find which one cause the crash.

In VS 2013 go to Debug > Windows > Threads (Ctrl + Alt + H) menu. This will open a window where you can see all threads. You can pause threads you want and execute what ever you want. hope this helps

Related

Visual Studio: automatically attach debugger to process as soon as process starts

Is it possible to attach the Visual Studio to a process right at the moment when that process starts? Ideally I would like for VS to listen to processes starting until one meets a certain condition, at which point it would immediately attach itself to that process.
In other stack overflow questions I've seen the suggestion to start the process from my own visual studio instance, but in my situation this is not possible. I need to attach VS to a debugger thread in another VS instance with an SSIS project. The debugger thread must be started by that VS instance. I can not attach my VS instance to the process quickly enough by hand to debug certain processes that happen immediately at the start of the thread.
System.Diagnostics.Debugger.Break()
It's not solution for all cases but simple way is to add this code at begining.
I didnt have VS on remote station but I was able to attach remotely and bellow lines saved my day
For Windows application
Windows.Forms.MessageBox.Show("wait attach process and click ok");
For ConsoleApp
Console.WriteLine("wait attach to process and press any key");
Console.Readkey();

how to stop debugger where it currently is?

Visual Studio 2010
To stop the debugger where it currently is, I normally use Break All from Debug menu.
However, now I'm multithreading, and this does show me a place in code, and it says this is where thread A is going to execute when task is back to it.
However, right now another thread is frozen somewhere, and I'd like to access the one which is currently running. How can I do that? To know the active thread and the last line of my code it did?
Have you tried DEBUG > WINDOW > THREAD ?
It will show you your currently executed thread (where your task is actually waiting) as well as other worker threads running. You can double-click on the thread you want to access its callstack and then see why it is blocked.
You just use the Threads window. Debug > Windows > Threads. Then you just click on the thread your interested in.
I use a Visual Studio plugin to freeze all other threads so when I step through the code it doesn't jump between the threads.
Debug Single Thread
Ctrl+S, D opens the Parallel Stacks window in VS 2010
Other Versions have similar functionality: See MSDN
Further reading: Walkthrough: Debugging a Parallel Application

Debugging with visual studio multi-threaded app

I am writing a threaded application.
I need a way to see the current active threads while debugging, I have tried to place a break point - but i only see the current running thread.
i need a way to inspect the other threads that are currently running as well.
is there any tool/method i can use to do so ?
you can use the built in Threads Window, while execution is at your selected break point
you can open the threads window going to debug->Windows->Threads
it will give you extensive information on all open threads.
you can read all about it here http://msdn.microsoft.com/en-us/library/w15yf86f.aspx
I like to use the VS thread window for this situations:
http://msdn.microsoft.com/en-US/en-en/library/ms164746%28v=vs.100%29.aspx

How to debug a single thread in Visual Studio?

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 tracing that single thread despite of other threads entering the same code-blocks.
I know this is possible through defining a condition on the break-point, that is, thread name = ... or thread Id = ... but my case is a heavy loaded ASP.NET application and as soon as I attach to w3wp.exe many threads will hit the break-points. I need some thing like a ThreadLocal<break-point>.
Is it possible? If so, how?
Here's what I did:
Set a conditional break point that I
knew would only hit on the thread
that I was looking for.
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.
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.
Freeze/Thaw threads is an incorrect way because other threads don't execute any code.
The most correct and usable way is to:
Hit Ctrl+A in the breakpoints window (select all breakpoints).
Right click and select "Filter...".
Enter "ThreadId=(current thread id)".
In Visual Studio 2015 and newer, the process is similar:
Hit Ctrl+A in the breakpoints window (select all breakpoints).
Right click and select "Settings...".
Check "Conditions" and select "Filter" in the dropdown
Enter "ThreadId=(current thread id)".
So all threads are executed, but the debugger hits on the current thread only.
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.
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.
A slightly different approach which I've used:
Create a normal breakpoint and let it get hit
Look in your threads window for the managed thread ID that you're current debugging
Right click your breakpoint in the breakpoints window and selecter filter
Enter ThreadId=xxx where xxx is the thread ID from 2
You can now debug without stopping other threads and without them hitting your breakpoint
This assumes you have time to do the above before a second thread hits your breakpoint. If not and other threads hit your breakpoint before you've done the above you can right click them in the threads window and choose freeze.
In VS 2019:
Set a breakpoint somewhere.
Hit F5 (Continue) until your thread comes.
Click on breakpoint to remove it.
You can step the thread with F10 or F11.
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
I would suggest adding another instance of the application on the live server, either on the same hardware or a new machine (cluster it) and then debug only that instance. I wouldn't add a breakpoint in code users are triggering. If that's not an option, I'd add more tracing.
However, if this is absolutely necessary and you need a solution stat, I'm sure you could add a breakpoint that breaks only if the request is coming from your IP address. You would do this by adding a conditional breakpoint that inspects HttpContext.Request.UserHostAddress. Note however that this slows down your application considerably.
If you don't want to stop all other threads (maybe you are attaching Visual Studio debugger to a running application that needs to answer to requests), you can use a macro that create and remove breakpoints automatically.
This is suggested in an answer to Stack Overflow question "Step over" when debugging multithreaded programs in Visual Studio.
However, the link only explain how to debug line by line. I suggest you modify the macro (if you're comfortable with it) to make it modify all breakpoints (in a given range of line for instance) to stop only on the current thread.
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.
in VS2019, the conditional breakpoint is tid == xxxxx
this way the breakpoint will be hit only on that thread
TL;DR; Just press F5 when it jumps to the wrong thread.
I'm debugging a multithreaded queue processor in Visual Studio Pro 2022 Preview, I placed a breakpoint at a point where each queue item being processed would hit it. The IDE pauses because it hit the breakpoint. I press F10 (Step Over) a few times to step through the code. Then the another thread hit the breakpoint, and the IDE popped me over to that thread. I pressed F5 (Continue). The second thread continued processing, and the yellow debug-line returned to my original thread.

C#.NET : A graphical control makes my app freeze after workstation unlock

I have a graphical control that is multithreaded.
Until now it worked fine, but I just noticed that whenever I'm on my application showing this control the following happens: if I lock and unlock my workstation, it freezes, like if it were in some kind of infinite loop.
Even stranger, this bug occurs only when I'm not launching the app from Visual Studio, and not attached to it.
Does anyone have a clue on what's happening?
For instance, if I attach Visual Studio to the already freezed app, can I see which lines of code my threads are executing?
Any help will be appreciated!
We recently had (for about a year and a half ;) this same problem. It also triggers sometimes when IE flushes caches, when you change colors of you theme. etc.
The problem was that we had a splash screen that had its window created on one thread and then it was shown (ShowDialog()) within other thread. Once we moved the window creation to the same thread that actually shows it, it resumed. There was also some changes with .Dispose():ng the splash window, and they could also have had an effect.
Microsoft has an article about this and they basically suggest to run their Spy++ program and look at your program when it's hung. There is a "Windows" -window, search for your application and look for any windows that should not be there. They possibly have a windows message pump active/attached but it is not pumping. The "change" message does not get handled and all .NET windows stall -> hang.
just attach VS to the frozen app and hit Pause button, VS will show executing code.

Categories