See the question and my original answer on StackOverflow

The problem does not seem to exist with Visual Studio 2017 or higher (I've not tested 2013 nor 2015).

How debug arguments are stored depends on project type packages (C, C#, C++, etc.), even if they are both using the MsBuild system.

Also, without manual intervention, debug arguments are not stored in the project file (.csproj, .vcxproj, etc.), but aside it in a .user file (so it can vary per user).

With Visual studio 2017, for an arguments like -nlp:"<u>", for a C# project, the .user file looks like this

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
    <StartArguments>-nlp:"&lt;u&gt;"</StartArguments>
  </PropertyGroup>
</Project>

And for a C++ project, the .user file looks like this:

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerCommandArguments>-nlp:"&lt;u&gt;"</LocalDebuggerCommandArguments>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
</Project>

We see that these are correctly escaped and the < and > are transformed into their respective XML entities.

Visual Studio 2012 doesn't act the same, so the XML must be escaped manually. And the problem may be in MsBuild, not strictly in Visual Studio. Editing the appropriate .user file and manually escaping your < and > characters as shown above will work round the problem in Visual Studio 2012.