Gdy w systemie Linux wystąpi błąd segmentacji, komunikat o błędzie Segmentation fault (core dumped)
zostanie wydrukowany na terminalu (jeśli występuje), a program zostanie zakończony. Jako twórca C / C ++ zdarza mi się to dość często i zwykle ignoruję to i przechodzę do gdb
, odtwarzając moją poprzednią akcję, aby ponownie wywołać nieprawidłowe odwołanie do pamięci. Zamiast tego pomyślałem, że być może będę mógł zamiast tego użyć tego „rdzenia”, ponieważ gdb
ciągłe działanie jest dość nużące i nie zawsze mogę odtworzyć błąd segmentacji.
Moje pytania są trzy:
- Gdzie jest zrzucany ten nieuchwytny „rdzeń”?
- Co zawiera
- Co mogę z tym zrobić?
gdb path-to-your-binary path-to-corefile
, ainfo stack
następnieCtrl-d
. Niepokojące jest tylko to, że dumping rdzeniowy jest czymś zwyczajnym.Odpowiedzi:
Jeśli inni ludzie posprzątają ...
... zwykle nic nie znajdziesz. Ale na szczęście Linux ma moduł obsługi tego, który można określić w czasie wykonywania. W /usr/src/linux/Documentation/sysctl/kernel.txt znajdziesz:
( dzięki )
Według źródła jest to obsługiwane przez
abrt
program (to jest narzędzie do automatycznego zgłaszania błędów, nie jest przerywane), ale w moim Arch Linux jest obsługiwane przez systemd. Możesz napisać własny moduł obsługi lub skorzystać z bieżącego katalogu.Ale co tam jest?
Teraz to, co zawiera, jest specyficzne dla systemu, ale według wszechwiedzącej encyklopedii :
... więc w zasadzie zawiera wszystko, czego
gdb
kiedykolwiek chciałeś, i więcej.Tak, ale chciałbym, żebym był szczęśliwy zamiast gdb
Można zarówno być szczęśliwy, ponieważ
gdb
będzie ładować żadnego zrzutu tak długo, jak masz dokładną kopię plik wykonywalny:gdb path/to/binary my/core.dump
. Powinieneś być w stanie kontynuować działalność jak zwykle i denerwować się próbą naprawienia błędów zamiast próbą ich odtworzenia.źródło
Również jeśli
ulimit -c
zwróci0
, plik zrzutu pamięci nie zostanie zapisany.Zobacz Gdzie szukać pliku podstawowego wygenerowanego przez awarię aplikacji linux?
Możesz także ręcznie wyrzucić zrzut pamięci CTRL- za pomocą tego przycisku - \proces kończy się i powoduje zrzut pamięci.
źródło
Plik podstawowy jest zwykle wywoływany
core
i znajduje się w bieżącym katalogu roboczym procesu. Istnieje jednak długa lista powodów, dla których nie można wygenerować pliku podstawowego i może on znajdować się gdzie indziej całkowicie pod inną nazwą. Szczegółowe informacje można znaleźć na stronie podręcznika użytkownika core.5 :źródło
W Ubuntu każda awaria zostaje zalogowana do / var / crash. Wygenerowany raport o awarii można rozpakować za pomocą narzędzia
a następnie zrzut podstawowy w rozpakowanym raporcie można odczytać za pomocą
źródło