2014-05-19 6 views
3

Je suis nouveau sur Google Test et je joue avec les exemples fournis. Mon problème est, lorsque je présente un échec et définir GTEST_BREAK_ON_FAILURE=1 (ou utiliser l'option de ligne de commande), GTest segfault. Je considère this example. Si j'insérer quelque chose comme cela dans l'un des tests, je vais commencer à obtenir le segfault:Pourquoi Google Test segfault?

EXPECT_EQ(8, 2*3);

Je répète, c'est seulement quand je l'ai également mis GTEST_BREAK_ON_FAILURE=1. J'ai couru depuis la ligne de commande et aussi avec gdb. Si cette variable d'environnement n'est pas définie, elle signale l'erreur mais ne segfault pas.

Tout indice de ce qui pourrait causer ce que je fais mal? J'ai cherché un problème similaire, mais je n'ai encore rien rencontré.

FYI J'utilise la version 1.7.0 de Google Test fonctionnant sur 64 bits CrunchBang Linux 11 "Waldorf".

modifier exemple de code:

// Tests factorial of positive numbers. 
TEST(FactorialTest, Positive) { 
    EXPECT_EQ(1, Factorial(1)); 
    EXPECT_EQ(2, Factorial(2)); 
    EXPECT_EQ(6, Factorial(3)); 
    EXPECT_EQ(40320, Factorial(8)); 
} 

sortie Debugger:

(gdb) run 
Starting program: /home/yourfavoriteprotein/bin/cpp_unit_test_frameworks/gtest-1.7.0/samples/mytest 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
Running main() from test_main.cc 
[==========] Running 6 tests from 2 test cases. 
[----------] Global test environment set-up. 
[----------] 3 tests from FactorialTest 
[ RUN  ] FactorialTest.Negative 
[  OK ] FactorialTest.Negative (0 ms) 
[ RUN  ] FactorialTest.Zero 
[  OK ] FactorialTest.Zero (0 ms) 
[ RUN  ] FactorialTest.Positive 
sample1_unittest.cc:112: Failure 
Value of: 2*3 
    Actual: 6 
Expected: 8 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000413427 in testing::UnitTest::AddTestPartResult(testing::TestPartResult::Type,   char const*, int, std::string const&, std::string const&)() 
(gdb) quit 
+0

ah, merci. Encore nouveau à SO :) – liang

+2

Beaucoup mieux maintenant! –

Répondre

7

GTEST_BREAK_ON_FAILURE=1 signifie que Google test drops you into the debugger si un test échoue.

Il se trouve qu'un moyen facile et portable de vous déposer dans le débogueur est de déclencher une erreur de segmentation.

En d'autres termes, ce comportement est voulu par la conception; Google Test déclenche délibérément un segfault pour lancer le débogueur. (Voir here dans le code de test Google.)

+0

Hmm, d'accord. Pourriez-vous me montrer les étapes à suivre pour tomber dans le débogueur? J'ai essayé d'exécuter le test dans gdb, mais il semble que ce n'est pas l'usage correct? – liang

+0

L'exécuter dans gdb avec cet ensemble d'options doit être correct; il devrait faire arrêter l'exécution à la ligne fautive. Vous pouvez ensuite utiliser les commandes GDB normales pour rechercher. Est-ce que ça ne marche pas? –

+0

non, il va segfault à l'intérieur de gdb, sauf si c'est par conception: (Je vais ajouter la sortie à ma question) – liang