Mam sytuację, w której uruchamiam kilka jednostektesty i jeden z nich wyzwala błąd segmentacji. Symptom wydaje się być powiązany z innym przypadkiem testowym, wykonując około 30 przypadków testowych przed niepowodzeniem. Oczywiście istnieje pewna zależność między przypadkami testowymi i mogę łatwo włączyć lub wyłączyć błąd segmentacji, komentując wcześniejszy przypadek testowy. Google Test / Mock 1.6.0 jest używany jako framework testowy. Binarny test jest napisany w całości w C ++ (gcc 4.6.3). Jest to pojedynczy wątek (chyba że Google Test tworzy wątki).
Jednak gdy uruchamiam wszystkie przypadki testowe w gdb, nie ma błędu segmentacji i to mnie zastanawia.
Jakie są realistyczne powody, dla których byłobybłąd segmentacji podczas uruchamiania pliku binarnego w terminalu, ale nie podczas uruchamiania tego samego pliku binarnego przez gdb? Chyba wszystko jest nieco wolniejsze, gdy gdb uruchamia kod, ale nie widzę, jak wpłynęłoby to na wynik.
Po prostu robię to, aby nie zobaczyć błędu:
gdb MyBinary
run
Ostatnie linie wydruku terminalu:
[ PASSED ] 368 tests.
[Inferior 1 (process 28349) exited normally]
A to, aby zobaczyć błąd:
MyBinary
Ostatnia linia wydruku terminala:
Segmentation fault
Odpowiedzi:
5 dla odpowiedzi № 1Jakie są realistyczne powody, dla których wystąpiłby błąd segmentacji podczas uruchamiania pliku binarnego w terminalu, ale nie podczas uruchamiania tego samego pliku binarnego przez gdb?
Dwa najbardziej powszechne to:
- GDB wyłącza randomizację przestrzeni adresowej. Jeśli czytasz jakiś niezainicjowany wskaźnik i zawsze tak się dzieje
NULL
w GDB, ale może nie byćNULL
z ASLR. - Masz wyścig danych, a GDB spowalnia tworzenie wątków, aby ukryć ten wyścig (GDB musi zrobić los pracy, aby śledzić wszystkie wątki).
Możesz uniemożliwić GDB wyłączenie ASLR za pomocą set disable-randomization off
.
Powinieneś prawdopodobnie sprawdzić swoje testy za pomocą MemorySanitizer i Antykanalizator wątków.