Debugging complex expressions is never easy. How do you see what was returned by inline and nested method calls? What did each predicate in the if statement evaluate to? Without simplifying the code or adding variables to store individual results, answering these questions is difficult. With OzCode’s powerful “Magic Glance” feature, you can answer those questions with ease! When stepping over an expression, OzCode provides a visual representation of what each predicate evaluated to and the return value of any inline and nested method calls. Simply click the Magic Glance Button and the expression will be visualized instantly, giving you the option to drill down and see individual expression results. Moreover, you can also examine objects returns by method calls by clicking on the magnifying glass.
When debugging objects and collections, you are often looking for a specific property or field, or a value held within a property or field. Unfortunately, this usually involves either a lot of clicking and scrolling, or writing custom debug-specific code. Finding items even in simple structures is not easy, not to mention doing so in a complex object graph. With our “Search” feature, this is no longer the case. Quickly and effortlessly search member names and values, no matter the size of the collection or complexity of the object graph!
When stepping through a foreach loop during a debug session, you are likely to encounter some common issues such as determining where you are in the loop and navigating to a specific item in the collection. While Visual Studio does offer ways to answer these questions, they are far from easy. With OzCode’s innovative “Foresee” feature, dealing with foreach loops is simple and intuitive. Foresee is a debug visualizer that helps you keep track of where you are in the loop at all times and allows navigation to specific items in the collection. It gives you visual representation of the collection including items already iterated over, the current item and upcoming items. Interested in a particular item in the collection? Just right click on the item and choose ‘Run to item’ and the loop will execute and then break on the desired item. No need to setup and deal with conditional break points!
When you want to compare files, you use a diff application to spot the differences. Unfortunately, when you need to compare two objects, you have to trust your eyes and memory. With our Compare feature, you can now spend less time squinting and let OzCode Compare objects and collections with a simple click! The results are displayed in a side-by-side view that you can use to drill down deep into the structure.
What about tracking changes in objects over time? Consider a long and complicated method which takes an instance of your class and performs various mutations on it. What has it actually changed? For a class with many members, which might also contain quite a few members themselves, finding the differences is difficult. With OzCode Compare you can now save an object’s state and later compare the object, during debugging, to its original saved state. After the function is executed, you can choose the “Compare to Snapshot” option to see the differences.
Objects can have many properties, but when debugging, not all of them are useful to you. You’re usually interested only in a selected few. For a Customer class, it might be the ID and Username properties, for a Point in 3D space, it might be the X, Y, and Z fields. With our “Reveal” feature, you can finally focus on the data that actually matters. Star the properties you are interested in and they will appear right next to the object. If you have, for example, a collection of Customer objects and you are mostly concerned with their first and last names, simply star the FirstName and Surname properties and immediately all the objects in the collection show these properties next to them. Your choices will be persisted across debugging session and across different Visual Studio solution files.
When debugging, sometimes the information you need is not contained in the fields and properties of an object; rather, it’s a calculation or an expression that is based on your object. You might find yourself wishing you had a different set of properties just for this specific debugging session.
For example, when you’re looking at a Player object in your game, you might like to see the distance from the nearest enemy without having to add such a property to its interface.
With our Custom Expression feature, you can create multiple custom expressions on any object type, which will be displayed just like any other member of that type. You can even star the ones that interest you the most.
For example, if a Customer class has a salary history among its properties, but what you really need to see in order to fix a bug, is the customer’s due taxes for a certain year, simply use the “Add Custom Expression” option on the Customer variable, and write the expression that you’d like to see. The expression will be displayed as a property of the Customer class, containing the value of the expression.
Filtering a collection in code is relatively easy and there are plenty of ways to do it. But how do you filter while debugging? For example, you have a collection of Customer objects and you’d like to filter the ones that are older than 35 years. Visual Studio immediate window and watch windows don’t support lambdas. With our Filter Collections feature, you can apply a filter expression to any collection. To solve the customer problem, choose the collection of customers and set its filter to: DateTime.Today.Year – [obj].Birthday.Year > 35, press Enter and see the results right away. Once a collection is filtered, all the other features work on the filtered results as well.
Quickly attach to processes
In many projects you can’t start a debugging session by just hitting F5. Instead, you have to use the “Attach to Process” option, find the correct process in the long list of processes, and finally connect to it. Later on, when you restart your debugging session, you have to do it all over again. And again. And again.
With OzCode, you only need to attach to a process once. After that, you can connect directly to the process using a shortcut key. Alternatively, you can use a list of recently attached processes.
In this screenshot, the user has previously attached to the process “CustomerProcessor.exe” which makes it available in the Quick Attach menu to quickly reattach (or directly by pressing SHIFT+ALT+1).
OzCode’s Quick Actions offer you the most relevant actions, depending on your current context. Want to add a breakpoint to every method in the class? Trace every entry to a particular method? Quickly run forward to a particular line of code? Hit Alt+Shift+D to open up the Quick Actions menu or click the Magic Wand, and do some magic!
Without OzCode, investigating an exception is a dreary task - navigating through a trail of inner exceptions, scrolling through lengthy callstacks, and squinting through the exception’s associated data to try to make sense of the error. With OzCode, all the relevant information about the exception is presented in a handy tool-window. You can navigate through each inner-exception with a super- convenient breadcrumb control, and even launch a Google or stackoverflow search right from within Visual Studio!
Show All Instances
OzCode makes it trivial to find specific objects in memory that you want to explore. Just open “Show All Instances of Type” and you’ll be able to see every object of that type that’s currently in memory. Why is that object still in memory? Are there any objects that contain this value? OzCode’s exciting new exploration tool effortlessly and instantly answers these questions and more.
When you’re debugging a tough problem, especially in a heavily multi-threaded scenario, it’s hard to see the forest for the trees. With OzCode, you can easily add logging statements on-the-fly and view the output using the provided fully featured integrated log-viewer. No longer do you need to stop debugging, add logging code and then rebuild each time you want to add a simple trace.