/ / Dlaczego błąd segmentacji nie jest odtwarzalny w gdb? - linux, gdb, googletest, googlemock

Dlaczego błąd segmentacji nie jest odtwarzalny w gdb? - linux, gdb, googletest, googlemock

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 № 1

Jakie 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:

  1. 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.
  2. 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.