Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent Debug.Assert(...) to show a modal dialog

I have a couple of libraries which use Debug.Assert(...). I think that the Debug.Assert(...) are fine and I still want them to execute, but I don't want them to block the execution of my application. Ideally, I would only like them to be logged somewhere.

Given that I can't change the code of the libraries (and that I still want to compile in debug and run the assertion), how do I prevent Debug.Assert(...) to show a modal dialog?

In addition, I would like to make sure that the main program continues when an Assert occurs (same behavior as the Ignore button).

Thanks!

like image 718
Martin Avatar asked May 18 '10 01:05

Martin


People also ask

How do I turn off assert statements in C++?

We can disable assertions in a program by using NDEBUG macro. Using NDEBUG macro in a program disables all calls to assert.

Does debug assert work in Release mode?

Assert works only in DEBUG mode - or, at least, when the DEBUG variable is defined. Otherwise, all those checks will simply get removed from the build result, so they will not impact your application when running in RELEASE mode.

How do asserts help with debugging?

An Example of Debugging With Assertions You'll typically use assertions to debug your code during development. The idea is to make sure that specific conditions are and remain true. If an asserted condition becomes false, then you immediately know that you have a bug.

What is assert in MVC?

Assert statements are an effective way to catch program logic errors at runtime. It has two arguments − A boolean expression for a true condition, and. What to display in case of false.


3 Answers

I wouldn't recommend it. The problem is that Debug.Assert is only supposed to be fired when you have bugs in your code. If you just ignore them or don't fix them, then you are doing your users a disservice. If, on the other hand, you're firing Debug.Assert for things that aren't bugs, then you're also doing your users a disservice (by reducing the impact of Debug.Assert).

Having said that, you can disable it. The first thing you need to do is remove the default listener from the Debug.Listeners collection:

Debug.Listeners.Clear(); 

Then, add your own instead:

Debug.Listeners.Add(new MyTraceListener()); 

You need to create a class that inherits from TraceListener:

class MyTraceListener : TraceListener {     // ...      public override void Fail(string msg, string detailedMsg)     {         // log the message (don't display a MessageBox)     } } 

The important method is the TraceListener.Fail method, which in the implementation of DefaultTraceListener is what displays the message box.

like image 189
Dean Harding Avatar answered Sep 19 '22 17:09

Dean Harding


There is no need for Debug.Listeners.Clear()

Just add to your .config:

<system.diagnostics>     <assert assertuienabled="false"/> </system.diagnostics> 
like image 34
Julian Avatar answered Sep 20 '22 17:09

Julian


Codekas answer is correct, if you want to hit things with a really big hammer. You can use the <assert> element in your application configuration file to set assertuienabled property to false and optionally give a log file for Asserts to be written to. Then you won't have to write your own listener.

You can read more about the assert element at its MSDN page.

like image 25
Matt Ellis Avatar answered Sep 18 '22 17:09

Matt Ellis