【发布时间】:2020-03-19 04:09:26
【问题描述】:
代码本身非常简单。我正在使用Catch2 进行单元测试,(我真的很喜欢它的界面)并闯入gdb,但没有获得关于Seg 的有用信息。所述简单代码引发的错误。
我确切地知道 是什么 导致了问题,但我不知道 为什么,或者我如何从 gdb 获得有问题的代码行(我已经广泛使用 Python 等效项 pdb,但 Python 中的错误似乎更直接)。
Flop.hpp
#ifndef FLOP
#define FLOP
class Flop {
private:
int tiles_[200][200][200];
public:
Flop();
}
#endif
Flop.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] 不应该占用超过 32MB 的内存,对吧?
因此,我有几个问题:
- 为什么会导致分段错误?
- 如何使用
gdb让我进入有问题的代码行?这段代码的未简化版本总共有几百行。幸运的是,我的问题在课程定义的早期就出现了,但是将所有内容注释掉并(煞费苦心地)逐行取消注释仍然需要一段时间,而这正是gdb旨在防止的!
【问题讨论】:
-
这能回答你的问题吗? Stack overflow C++
-
"Python 中的错误似乎更直接" - python 中的错误由熟练的程序员修饰,试图让用户(其他程序员)意识到遇到的潜在问题。当您编写 C++ 时,您通常是提供有用信息的程序员,因此请注意发生的情况。人们依靠你回报好东西。
标签: c++ segmentation-fault gdb catch2