SEH исключение при использовании googlemock

Я начинаю использовать googlemock с googletest, но получаю исключение SEH, которое я не могу понять.

Сообщение об ошибке:

unknown file: error: SEH exception with code 0xc0000005 thrown in the test body.

Я читал несколько похожих вопросов по SO и в других местах, но пока не нашел ответа на такой простой пример.

то есть это происходит в моем реальном коде, но я также воспроизвел ошибку на очень простом примере ниже. Я строю с MSVC2008.

код, который воспроизводит ошибку:

#include "gtest/gtest.h"#include "gmock/gmock.h"
#include <iostream>

using testing::Exactly;

class Production
{
public:
virtual ~Production() {};
virtual void fn() = 0;
};

class ProductionCode : public Production
{
public:
virtual ~ProductionCode() {};
void fn()
{
std::cout << "CALLED ProductionCode::fn" << std::endl;
}
};

class MockProduction : public Production
{
public:
virtual ~MockProduction() {};
MOCK_METHOD0(fn, void());
};

class ProductionUser
{
public:
void methodUnderTest(Production *p)
{
p->fn();
}
};

TEST(ProductionTest, CallTheProductionFunction) {
ProductionCode p;

ASSERT_NO_THROW( p.fn() );
}

TEST(ProductionTest, CallTheMethodUnderTest) {
Production* p = new ProductionCode;
ProductionUser u;

ASSERT_NO_THROW( u.methodUnderTest(p) );

delete p;
}

TEST(ProductionTest, CallTheMethodUnderTestWithMock) {
MockProduction m;

EXPECT_CALL(m, fn())
.Times(Exactly(1));

ProductionUser u;
ASSERT_NO_THROW(u.methodUnderTest(&m));
}

мой тестовый вывод из консоли:

[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from ProductionTest
[ RUN      ] ProductionTest.CallTheProductionFunction
CALLED ProductionCode::fn
[       OK ] ProductionTest.CallTheProductionFunction (4 ms)
[ RUN      ] ProductionTest.CallTheMethodUnderTest
CALLED ProductionCode::fn
[       OK ] ProductionTest.CallTheMethodUnderTest (2 ms)
[ RUN      ] ProductionTest.CallTheMethodUnderTestWithMock
unknown file: error: SEH exception with code 0xc0000005 thrown in the test body.

[  FAILED  ] ProductionTest.CallTheMethodUnderTestWithMock (0 ms)
[----------] 3 tests from ProductionTest (10 ms total)

[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (13 ms total)
[  PASSED  ] 2 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] ProductionTest.CallTheMethodUnderTestWithMock

1 FAILED TEST

.\simple.cpp(59): ERROR: this mock object (used in test ProductionTest.CallTheMe
thodUnderTestWithMock) should be deleted but never is. Its address is @000000000
014F800.
ERROR: 1 leaked mock object found at program exit.
Press any key to continue . . .

Я использую свою собственную основную функцию следующим образом:

#include "gtest/gtest.h"#include "gmock/gmock.h"
int main(int argc, char** argv) {
// The following line must be executed to initialize Google Mock
// (and Google Test) before running the tests.
::testing::InitGoogleMock(&argc, argv);
return RUN_ALL_TESTS();
}

Я предполагаю, что я делаю довольно основную ошибку здесь, Кто-нибудь может увидеть, где я иду не так?
Спасибо!

[Оригинал отредактирован, чтобы сделать код & совпадение выходных данных консоли]

7

Решение

Я встретил ту же проблему, когда я скомпилировал gmock как DLL и связал это в другом проекте.
После долгих попыток я нашел причину:

Вы должны скомпилировать gmock и ваш проект в одной конфигурации!

Это означает, что вы должны скомпилировать gmock в конфигурации DEBUG (RELEASE), если вы хотите связать его в режиме DEBUG (RELEASE). Если нет, то

неизвестный файл: ошибка: исключение SEH с кодом 0xc0000005, брошенным в тело теста.

всегда происходит.

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

3

Другие решения

Я думаю, что вы можете заставить gtest не указывать точное исключение (что может быть сделано с помощью кода вроде

::testing::GTEST_FLAG(catch_exceptions) = false;

или из командной строки)
И если затем вы используете отладчик, вы легко получите стек. Или даже если вы этого не сделаете, я ожидаю, что * nix-подобная ОС запишет файл ядра, чтобы проанализировать его позже.

2

Я получил эту ошибку, потому что разыменовывал нулевой указатель.

-1
По вопросам рекламы [email protected]