Свързването на Visual Studio 2012 C++ Unit Testing проект с exe причинява нарушения на достъпа

Започвам със съществуващ, монолитен, .exe собствен проект на Visual Studio 2012. Искам да добавя собствен проект Unit Test заедно, според 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):

Callee (.exe проект) Header.h:

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

Callee (.exe проект) Header.cpp:

#include "Header.h"

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

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

    return output;
}

Обаждащ се (проект за Unit Test) 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)).

Така че въпросът е, мога ли по някакъв начин да направя своя exe проект модулно тестван с помощта на модулно тестване на Visual Studio 2012 или просто трябва вече да започна да го разделям на dll?

Редактиране:

Изпратих проблем в Microsoft Connect относно това и ми казаха, че това наистина е грешка: https://connect.microsoft.com/VisualStudio/feedback/details/804696/linking-visual-studio-2012-c-unit-testing-project-against-an-exe-causes-access-violations

Направих още няколко теста, използвайки същото решение, което прикачих, на напълно нови инсталации на Windows 7 Pro x64 SP1 и Windows 8.1 Pro Preview x64 на виртуални машини VMware Workstation 9. Нищо освен всички актуализации на Windows и конкретното Visual Studio не беше инсталирано за всеки тест. Винаги се връщах към чиста моментна снимка между тестовете. Също така стартирах всички Visual Studios с всички настройки по подразбиране.

В 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
Добре, тогава ще го изтрия от списъка си. Thnx за отговора :)   -  person Onno    schedule 13.11.2013
comment
Може би не разбирам проблема ви, но ми се струва, че сте усложнили ситуацията. Не е нужно да експортирате функциите на приложението си. Можете да свържете библиотеката на приложението и обектните файлове в .exe файла на проекта за модулен тест. Вижте това   -  person riderBill    schedule 18.03.2016
comment
Вашите модулни тестове насочени ли са към правилната рамка?   -  person Merav Kochavi    schedule 09.02.2017