Использование отладки в смешанном режиме в тесте управляемого модуля в Visual Studio 2013

У меня есть модульный тест C# в тестовой среде Visual Studio 2013, который использует CLI и собственный код. Я хотел бы исследовать нативную часть кода во время выполнения модульного теста C#. Однако при запуске Test -> Debug -> All Tests запускается управляемый отладчик, поэтому точки останова в нативном коде не удаляются, и я не могу отследить код C# -> C++/CLI, как при запуске программы в отладчике смешанного режима.

Например, этот код в моем модульном тесте:

[TestMethod]
public void TestRoundTripEvaluate()
{
     var obj = new MyCLIObject();
     var roundtripped = RoundtripXml( obj );

     // I would like to trace into here to see why Equals returns false.
     // But the definition for MyCLIObject is in a CPP file and cannot be navigated 
     // to running the unit test because Visual Studio starts the debugger as "managed only"
     // when using Test -> Debug -> All Tests
     Assert.IsTrue( obj.Equals( roundtripped ) ); 
}

Глядя на настройки проекта для проекта модульного теста, все в разделе "Отладка" отключено, поэтому я не могу установить флажок "Включить отладку собственного кода", что позволяет такое поведение для обычной программы.

Как включить отладку в смешанном режиме или отладку только в собственном режиме при выполнении модульного теста VS C#?

2 ответа

  1. Перейдите на страницу свойств вашего проекта модульного тестирования (щелкните правой кнопкой мыши проект в обозревателе решений, затем нажмите "Свойства")
  2. Перейдите на вкладку "Отладка" (4-й сверху в списке слева)
  3. Включен флажок "Включить отладку собственного кода"
  4. Отладка вашего модульного теста - вы можете установить точки останова как в собственном, так и в управляемом коде, и можете перейти к любому виду кода.

У меня была та же проблема, что и у вас, и я смог заставить ее работать с помощью этих шагов. До включения этого флажка он не работал. Для записи я использую VS2013 обновление 4.

Я не знаю способ отладки нативный код в VS. Если вы хотите понять, почему два объекта не равны, вам нужно проверить, какое сравнение происходит для этого вызова "равно".

попробуйте прочитать это: https://msdn.microsoft.com/en-us/library/ms173147(VS.80).aspx

поскольку MyCLIObject не тот же тип, что и RoundtripXml, если сравнение в MyCLIObject ищет этот тип RoundtripXmlя бы ожидал, что он всегда вернется false,

Вы могли бы позвонить:

Assert.IsTrue( roundtripped.Equals(obj) ); 

затем посмотрите, что происходит в версии класса RoundtripXml Equals() (при условии, что это не cpp/native).

Другие вопросы по тегам