C++11 当进入函数调用堆栈时,该指针被设置为null——在gdb下的Google测试中发生

C++11 当进入函数调用堆栈时,该指针被设置为null——在gdb下的Google测试中发生,c++11,gdb,cygwin,googletest,g++4.8,C++11,Gdb,Cygwin,Googletest,G++4.8,然后我对该函数执行了一个“步骤”,它立即给了我一个异常,抱怨“this”为null(this=0x0): 这有多荒谬?我确信这只发生在我调试用Google test编写的测试用例时,而不是运行它们时: (gdb) step Program received signal SIGILL, Illegal instruction. 0x0000000100401bb7 in BishopArranger::GetCandidates (this=0x0, cursor=0) at ./sr

然后我对该函数执行了一个“步骤”,它立即给了我一个异常,抱怨“this”为null(this=0x0):

这有多荒谬?我确信这只发生在我调试用Google test编写的测试用例时,而不是运行它们时:

(gdb) step

Program received signal SIGILL, Illegal instruction.
0x0000000100401bb7 in BishopArranger::GetCandidates (this=0x0, cursor=0)
    at ./src/bishop_arranger/BishopArranger.cc:84
84      {
如您所见,当我运行Google测试时,产生了错误的输出12。尽管程序未能通过断言,但它毫无例外地完成了

您可能感兴趣的一些信息:

1,我的程序中只有一个线程,尽管根据他们的文档,Google Test使用pthreads来并行执行测试(它说不能保证某些测试在其他测试之前完成)

不确定这是否与我的情况相关,因为我的每个测试都有自己的对象,并且没有常见的设置/拆卸部分,因此一个测试中的对象不太可能被另一个测试破坏。它们看起来像:

[ RUN      ] Solution.TinyBoardTinyK
./test/bishop_arranger/UnitTests.cc:14: Failure
Value of: bishopArranger.Solution(2, 2)
  Actual: 12
Expected: 4
[  FAILED  ] Solution.TinyBoardTinyK (0 ms)
平台:CYGWIN_NT-6.1;G++用于编译谷歌测试和该程序:4.83.(是的,我遵循谷歌测试文档,并从源编译使用同一版本的编译器,以避免我的C++程序潜在的问题);gdb版本:7.8


提前感谢您的投入

我相信这是一个隐藏在cygwin中的bug,因为我后来在一个正版Linux系统上尝试了同样的方法,并且一切正常。我学到的教训是:如果你想做严肃的开发,远离Cygwin

<>这也将发生在静态C++对象中,这些对象还没有被构建。但目前还不清楚你是否正面临着这个问题

对于这种混乱,请参阅。在GCC下,使用
init_priority
构建它们。在Windows下,使用
init_seg
创建它们

(gdb) step

Program received signal SIGILL, Illegal instruction.
0x0000000100401bb7 in BishopArranger::GetCandidates (this=0x0, cursor=0)
    at ./src/bishop_arranger/BishopArranger.cc:84
84      {
[ RUN      ] Solution.TinyBoardTinyK
./test/bishop_arranger/UnitTests.cc:14: Failure
Value of: bishopArranger.Solution(2, 2)
  Actual: 12
Expected: 4
[  FAILED  ] Solution.TinyBoardTinyK (0 ms)
TEST(Solution, BoundaryCondition)
{
    BishopArranger bishopArranger;
    EXPECT_EQ(0, bishopArranger.Solution(0, 0));
}


TEST(Solution, TinyBoardTinyK)
{
    BishopArranger bishopArranger;
    EXPECT_EQ(4, bishopArranger.Solution(2, 2));
}


TEST(Solution, SmallBoardSmallK)
{
    BishopArranger bishopArranger;
    EXPECT_EQ(260, bishopArranger.Solution(4, 4));
}
BishopArranger::GetCandidates (this=0x0, ...)