Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I prevent the CLR from optimizing away debugging information?

I've written an abstract base class for unit tests that sets up just enough environment for our tests to run. The class exposes some of the runtime environment bits as properties whose types vary test by test (the property types are type arguments specified in the inheriting, concrete test class).

This is all well and good, except a co-worker noticed that he can't view any of the class' properties in the debugger. Turns out the reason is that he had no fields defined in his inheriting class, and the CLR optimized something or other away, so the debugger couldn't display the properties. Is it possible to prevent this in the base class somehow, or do I have to resort to telling everyone they need to define at least one field which is used somewhere during the tests?

Edit:

Sounds like a likely culprit should be the optimization/debug settings. That said, I'm building the app from Visual Studio in Debug mode, I've double-checked that all projects are set for a debug build, and none of the projects in this solution have the Optimize flag set.

Perhaps it would also be relevant to note that I'm using MSTest and the Visual Studio test runner.

Edit 2:

By "can't view properties" I'm referring to when I evaluate the property in Quickwatch and get a red exclamation mark and a text "Could not evaluate expression" error text. And lest you think I'm entirely off base with my suspicions, adding an instance field that gets initialized in the test initialize method makes the problem go away...

Edit 3:

Checked the build output. I notice that the compiler is invoked with these options:

/debug+
/debug:full
/optimize-
/define:DEBUG,TRACE

I should think that would be enough to stop this from happening, but there you go. :)

like image 304
Rytmis Avatar asked Jun 30 '09 09:06

Rytmis


People also ask

How do I turn off Optimization in Visual Studio?

Open the project's Property Pages dialog box. For details, see Set C++ compiler and build properties in Visual Studio. Select the Configuration Properties > C/C++ > Optimization property page. Modify the Optimization property.

What does the optimize switch do?

The Optimize option enables or disables optimizations performed by the compiler to make your output file smaller, faster, and more efficient.

What does optimize code do?

Code optimization is any method of code modification to improve code quality and efficiency. A program may be optimized so that it becomes a smaller size, consumes less memory, executes more rapidly, or performs fewer input/output operations.

What is optimize code in Visual Studio?

Basically, this allows the run-time JIT to optimize the code how it sees fit, including reordering and inlining code. This will produce more efficient and smaller code, but it means that trying to debug the code can be very challenging (as anyone who's tried it will tell you).


2 Answers

I've encountered this same problem before, and it's invariably due to the fact that Debug mode has been turned off in some way. Try checking each of the following:

  1. The current build configuration for the solution and the appropiate project(s) is Debug.
  2. In the Build tab of the property pages, the Optimize code checkbox is unchecked.

If this is all correct, then I recommend you paste the text written to the Output window here so can we can potentially spot any more unusual cause of the issue.

like image 78
Noldorin Avatar answered Sep 28 '22 01:09

Noldorin


Dont Forget the obvious

Make sure your arent trying to debug your release build. All of these compile settings set behind these configurations. The debug version is one for debugging ;-)

like image 35
phil soady Avatar answered Sep 28 '22 01:09

phil soady