Code Focused

Test Out Code Variations at Runtime Using a Static Variable

Recompiling source code while debugging is possible, but sometimes your C++ project might not be configured to use it.

In this tip, I'd like to show a simple technique that allows switching between multiple versions of the code at runtime.

Often, when I'm testing a new solution, I'd like to run an old version and make a comparison, just to find out: Is my new method better or not? Sometimes it's even worthwhile to try several different approaches. In C++ apps this might not be super-easy because you need to recompile your project every time. But what if you could do it at runtime?

In Visual Studio there's an efficient option: Edit and Continue. While debugging, you can recompile the code and see changes while the app is running. While E&C is greatly improved in the more recent VS 2015, there are still some limitations (read more here). But in older versions of Visual Studio, for example, you aren't allowed to use the feature on 64-bit code. It's for those situations I'd like to show a simplified, "manual" version.

The approach might sound silly at first. But it works! Just add one static variable to the code. The variable could be a Boolean value or an integer, depending on your needs. Use it like this:

static bool bEnableMyNewFeature = true;  
  if (bEnableMyNewFeature) newSolution(); else oldSolution();  

Then, while debugging, you can change the value of this variable. Immediately you'll be able to see results, as shown in Figure 1. The variable must be static, so there's only one for all of the function's execution.

[Click on image for larger view.] Figure 1. Testing Out Code Variations at Runtime

How can you change the value during debugging? Go to the watch window or just hover on top of the variable. You'll see an edit box where the value can be changed.

I used this simple variable technique in places where I want to experiment with some options for new solutions. I can enable it, play with that, see if nothing breaks. The drawbacks: You have to know what code versions you want. The set of options must be well-defined. There's no way to write some new code while running the app (not without using Edit and Continue or some other advanced techniques).

The method I presented here might not work well in multithreaded code. There's a high chance not all threads will see the variable change immediately so that it might cause some additional problems. Still, for linear code, it should work relatively well.

Please remember to disable or, better, remove that ugly variable in the final builds and commits!

About the Author

Bartlomiej Filipek is a software developer in Poland who specializes in C++, Windows and graphics programming. He worked for a number of companies developing multimedia, document editors, games, graphics drivers and flight planning systems, and has taught game development at local university. Follow Bart's blog at http://www.bfilipek.com and on Twitter @fenbf.

comments powered by Disqus

Featured

  • Microsoft's Tools to Fight Solorigate Attack Are Now Open Source

    Microsoft open sourced homegrown tools it used to check its systems for code related to the recent massive breach of supply chains that the company has named Solorigate.

  • Microsoft's Lander on Blazor Desktop: 'I Don't See a Grand Unified App Model in the Future'

    For all of the talk of unifying the disparate ecosystem of Microsoft-centric developer tooling -- using one framework for apps of all types on all platforms -- Blazor Desktop is not the answer. There isn't one.

  • Firm Automates Legacy Web Forms-to-ASP.NET Core Conversions

    Migration technology uses the Angular web framework and Progress Kendo UI user interface elements to convert ASP.NET Web Forms client code to HTML and CSS, with application business logic converted automatically to ASP.NET Core.

  • New TypeScript 4.2 Tweaks Include Project Explainer

    Microsoft shipped TypeScript 4.2 -- the regular quarterly update to the open source programming language that improves JavaScript with static types -- with a host of tweaks including a way to explain why files are included in a project.

Upcoming Events