Сам код чрезвычайно простой. Я использую Catch2 для модульного тестирования (мне очень нравится его интерфейс) и разбиваю на gdb
, но не получаю никакой полезной информации для сега. ошибка, вызванная указанным простым кодом.
Я точно знаю что вызывает проблему, но я не знаю почему , или как я мог бы получить строку кода с ошибкой из gdb
(Я широко использую эквивалент Python, pdb
, но ошибки в Python кажутся гораздо более простыми).
Flop.hpp
#ifndef FLOP
#define FLOP
class Flop {
private:
int tiles_[200][200][200];
public:
Flop();
}
#endif
Флоп. cpp
#include "Flop.hpp"
Flop::Flop() { }
test_Flop. cpp
#include "catch.hpp"
#include "Flop.hpp"
SCENARIO("I bang my head against a wall") {
Flop flop;
WHEN("I try to run this test") {
THEN("This program SEGFAULTs") {
REQUIRE(1==1);
}
}
}
main. cpp содержит все, что должно, наряду с загруженным catch.hpp (как указано в руководстве).
Я компилирую это с помощью: g++ Flop.cpp test_Flop.cpp main.cpp -o run_test
и запускаю это с gdb -ex run --args ./run_test -b
, что позволяет Catch2 взломать отладчик. Результат таков:
Program received signal SIGSEGV, Segmentation fault.
0x0000555555566e9e in ____C_A_T_C_H____T_E_S_T____0() ()
С обратным ходом:
#0 0x0000555555566e9e in ____C_A_T_C_H____T_E_S_T____0() ()
#1 0x000055555557e15e in Catch::TestInvokerAsFunction::invoke() const ()
#2 0x000055555557d7b1 in Catch::TestCase::invoke() const ()
#3 0x0000555555577f0a in Catch::RunContext::invokeActiveTestCase() ()
#4 0x0000555555577c59 in Catch::RunContext::runCurrentTest(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) ()
#5 0x000055555557671b in Catch::RunContext::runTest(Catch::TestCase const&) ()
#6 0x00005555555797cc in Catch::(anonymous namespace)::TestGroup::execute() ()
#7 0x000055555557ab49 in Catch::Session::runInternal() ()
#8 0x000055555557a853 in Catch::Session::run() ()
#9 0x00005555555b6195 in int Catch::Session::run<char>(int, char const* const*) ()
#10 0x000055555558fdf0 in main ()
ОК. Итак, SIGSEGV
указывает, что мы пытались читать / записывать в память, к которой у процесса нет доступа. Если в Flop.hpp я вместо этого скажу int tiles_[10][10][10]
, то все работает нормально. Таким образом, установка tiles_
на больший размер как-то резервирует часть памяти, к которой нет доступа? Я новичок в C ++ (и, следовательно, плохо знаком с тем, что на самом деле думает о том, что происходит на компьютере, когда я что-то программирую), поэтому поправьте меня, если я ошибаюсь, но int tiles_[200][200][200]
не должно занимать намного больше 32 МБ памяти, верно ?
Итак, у меня есть пара вопросов:
- Почему это вызывает ошибку сегментации?
- Как я могу использовать
gdb
, чтобы получить меня обидеть строку кода? Не упрощенная версия этого кода - всего несколько сотен строк. К счастью, моя проблема была в начале определения класса, но комментирование всего и (кропотливо) посткомментирование строки все еще занимало время, и это то, что gdb
должно было предотвратить!