Связывание проекта модульного тестирования Visual Studio 2012 C++ с исполняемым файлом вызывает нарушения прав доступа

Я начинаю с существующего монолитного проекта Visual Studio 2012 с расширением .exe. Я хочу добавить собственный проект модульного тестирования, согласно http://msdn.microsoft.com/en-us/library/hh419385.aspx#objectRef, который предполагает, что это поддерживается:

Тестируемый код создается в виде файла .exe: добавьте отдельный тестовый проект. Свяжите его с выходным объектным файлом.

Я dllexport создал методы, которые мне нужно было протестировать, связал мой тестовый проект с .lib библиотекой exe-проекта, и, похоже, все заработало для моих простых тестовых функций. Однако, как только я попробовал что-то более интересное, я начал получать нарушения прав доступа, подобные этому:

Исключение первого шанса по адресу 0x04fa4aac (TestApplication.exe) в vstest.executionengine.x86.exe: 0xC0000005: место чтения нарушения прав доступа 0x011bf0e0.

Поэтому я создал новое решение с самой простой парой проектов .exe и Unity Test, которую только мог собрать, и смог воспроизвести исключения с помощью этого вызывающего объекта (проект Unit Test) и вызываемого объекта (проект .exe):

Вызываемый абонент (проект .exe) Header.h:

#include <string>
__declspec( dllexport ) std::string __cdecl strTest( std::string j );

Вызываемый абонент (проект .exe) Header.cpp:

#include "Header.h"

std::string strTest( std::string j ) {
    std::string output;

    output += j;
    output += "HAHA";

    return output;
}

Вызывающий абонент (проект модульного тестирования) unittest1.cpp:

#include "CppUnitTest.h"
#include "../TestApplication/Header.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest {    
    TEST_CLASS(UnitTest1) {
    public:
        TEST_METHOD(TestMethod1) {
            std::string test = strTest( "bla " );
        }
    };
}

Нарушение прав доступа всегда происходит внутри конструктора std::string, вызываемого строкой std::string output; в strTest().

Я убедился, что оба проекта имеют идентичные настройки (особенно соглашение о вызовах, настройки оптимизации/отладки, разрядность и набор символов). Я также отключил и удалил предварительно скомпилированные заголовки для обоих проектов.

Я даже пытался создать второй проект exe с функциями, указанными выше, и имел ссылку на основной проект exe против второго проекта exe. Это сработало отлично. Когда я попытался связать свой проект Unit Test с этим вторым exe-проектом, точно так же, как у меня работал мой основной exe-проект, я снова получил те же нарушения прав доступа.

Единственное, что сработало, это преобразовать мой exe-проект в dll-проект (буквально просто изменив Тип конфигурации моего exe-проекта с Application (.exe) на Dynamic Library (.dll)).

Итак, вопрос в том, могу ли я каким-то образом получить модульное тестирование моего исполняемого проекта с помощью модульного тестирования Visual Studio 2012, или я должен уже начать разбивать его на библиотеки DLL?

Редактировать:

Я отправил сообщение об этом в Microsoft Connect, и мне сказали, что это действительно ошибка: https://connect.microsoft.com/VisualStudio/feedback/details/804696/linking-visual-studio-2012-c-unit-testing-project-против-an-exe-причины-нарушения-доступа

Я провел еще несколько тестов, используя то же решение, которое я прикрепил к совершенно новым установкам Windows 7 Pro x64 SP1 и Windows 8.1 Pro Preview x64 на виртуальных машинах VMware Workstation 9. Для каждого теста не устанавливалось ничего, кроме всех обновлений Windows и конкретной Visual Studio. Я всегда возвращался к чистому снимку между тестами. Я также запускал все Visual Studio со всеми настройками по умолчанию.

В Windows 7 все, что я пробовал, приводило к одному и тому же нарушению прав доступа. Я попробовал свое решение с помощью:

  1. Visual Studio Express 2012 для рабочего стола Windows с обновлением 2
  2. Visual Studio Express 2012 для рабочего стола Windows с обновлением 3
  3. Visual Studio 2012 Ultimate с обновлением 3
  4. Visual Studio 2013 RC Professional

В Windows 8.1 с Visual Studio Express 2012 для рабочего стола Windows с обновлением 3 мои модульные тесты работали нормально. Я предполагаю, что другие комбинации, которые я пробовал в Windows 7, отлично работают в 8.1.

Вернувшись в Windows 7, когда я переключился с платформы x86 на платформу x64 и установил архитектуру процессора по умолчанию для параметров теста на X64, тот же тест прошел. У меня больше не было нарушений прав доступа.

Поэтому, скорее всего, проблема связана с платформой Windows 7/x86.

Кроме того, что касается нарушения доступа, это не всегда так изящно. Я также иногда получаю диалоговое окно «vstest.executionengine.x86.exe перестало работать» со следующими подробностями проблемы:

Problem signature:
Problem Event Name:    BEX
Application Name:    vstest.executionengine.x86.exe
Application Version:    12.0.20827.3
Application Timestamp:    521cc637
Fault Module Name:    StackHash_9321
Fault Module Version:    0.0.0.0
Fault Module Timestamp:    00000000
Exception Offset:    00ae9998
Exception Code:    c0000005
Exception Data:    00000008
OS Version:    6.1.7601.2.1.0.256.1
Locale ID:    1033
Additional Information 1:    9321
Additional Information 2:    9321642ea520dd869526c054c7161ae9
Additional Information 3:    bfae
Additional Information 4:    bfaed60192419c1d7d34eac41dbe71a8

person Yelmond    schedule 06.10.2013    source источник
comment
Вы нашли решение этой проблемы? я похоже тоже этим страдаю   -  person Onno    schedule 12.11.2013
comment
Не совсем. Кажется, это ошибка в Visual Studio. Я сообщил об ошибке в Microsoft Connect, и мне сказали, что они ее изучают: connect.microsoft.com/VisualStudio/feedback/details/804696/ Единственный обходной путь, который я нашел, был переключиться на dll или 64-битный проект. Я переключился на dll, чтобы двигаться дальше. Я также добавлю информацию, которую я собрал для отчета об ошибке.   -  person Yelmond    schedule 13.11.2013
comment
Хорошо, тогда я вычеркну это из своего списка. Спасибо за ответ :)   -  person Onno    schedule 13.11.2013
comment
Может я не понимаю вашей проблемы, но мне кажется вы слишком усложняете ситуацию. Вам не нужно экспортировать функции вашего приложения. Вы можете связать библиотеку приложения и объектные файлы с файлом .exe проекта модульного теста. См. это   -  person riderBill    schedule 18.03.2016
comment
Ориентированы ли ваши модульные тесты на правильную структуру?   -  person Merav Kochavi    schedule 09.02.2017