This entry is just an extension to the blog Memory Dump to the Rescue by Bruno Marques. In he’s blog he shows how to generate a mini dump on a exception in code. Please read he’s blog first. If you want to use this in ASP .Net MVC you could take the same approach:
1: [HttpGet]
2: public ActionResult Crash()
3: {
4: try
5: {
6: // compiler doesn't allow division by a zero constant,
7: // so we have to use an auxiliary variable
8: int zero = 0;
9: int value = 123456789 / zero;
10: }
11: catch (Exception)
12: {
13: string path = Path.Combine(HttpRuntime.AppDomainAppPath, @"App_Data\Dumps\");
14: string fileName = string.Concat(path, Process.GetCurrentProcess().ProcessName, ".dmp");
15: MiniDump.WriteDump(fileName);
16: }
17:
18: return View();
19: }
The first thing to note in the code is that I write the dump file to my App_Data folder under a sub folder named Dumps. This is a better approach for file and folder access rights in ASP .Net applications. I have a small issue with this approach. If I have to insert all this code to write a dump file in all my actions then my code will become very cluttered and maintenance of the code becomes difficult.
The Better Approach
All developers that have developed with ASP.Net MVC know of the Attribute [HandleError] that you can put on top of your controllers. With this we can create our own custom attribute to handle the error and create a mini dump file for the application.
Here is the custom attribute code:
1: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
2: public class DumpHandleError : HandleErrorAttribute
3: {
4: public override void OnException(ExceptionContext filterContext)
5: {
6: string path = Path.Combine(HttpRuntime.AppDomainAppPath, @"App_Data\Dumps\");
7: string fileName = string.Concat(path, Process.GetCurrentProcess().ProcessName, ".dmp");
8: MiniDump.WriteDump(fileName);
9:
10: base.OnException(filterContext);
11: }
12: }
Now I can cleanup my controller code as follow:
1: namespace DumpMvcApplication.Controllers
2: {
3: [DumpHandleError]
4: public class HomeController : Controller
5: {
6: [HttpGet]
7: public ActionResult Index()
8: {
9: ViewData["Message"] = "Welcome to ASP.NET MVC!";
10:
11: return View();
12: }
13:
14: [HttpGet]
15: public ActionResult Crash()
16: {
17: // compiler doesn't allow division by a zero constant,
18: // so we have to use an auxiliary variable
19: int zero = 0;
20: int value = 123456789 / zero;
21:
22: return View();
23: }
24: }
25: }
All unhandled exceptions will be handled by my custom attribute to create a mini dump for the application.
Some additional tips is to create a abstract base controller with the attribute added and inherit other controllers from the base controller. Currently when the code creates a mini dump it will overwrite the dump file. If you want individual mini dumps for each exception I would recommend to add a DateTime.Now to the filename, but be aware that you have to cleanup your dumps else you might run out of disk space.
Hope this helps to ease your debugging experience for ASP .Net MVC applications.
Please comment and let me know on improvements that can be made to the code.
Cheerio!