Zrzut rdzenia, ale plik rdzenia nie znajduje się w bieżącym katalogu?

277

Podczas działania programu C mówi „(zrzut pamięci)”, ale nie widzę żadnych plików pod bieżącą ścieżką.

Ustawiłem i zweryfikowałem ulimit:

ulimit -c unlimited 
ulimit -a 

Próbowałem także znaleźć plik o nazwie „core”, ale nie otrzymałem pliku zrzutu pamięci?
Jakaś pomoc, gdzie jest mój podstawowy plik?

webminal.org
źródło
1
Czy program w pewnym momencie wywołuje chdir? Jeśli tak, spójrz tam.
William Pursell,
2
Czy program zmienia katalog roboczy? Spójrz tam.
Richard Pennington
Przeszukałem cały dysk
twardy w
1
oops nie, nie ma go ... Sprawdziłem to ... programuj katalog do / mnt i / i sprawdziłem oba katalogi, ale nie mogłem znaleźć pliku. Nawet znalazłem / -nazwa „* core”. nawet to nie pokazało mi pliku. Program używa C + sqlite, wstawiając wartości, które zrzuca rdzeń. Powiedział błąd asercji == 0 po raz pierwszy, a błąd = 101 po raz drugi.
webminal.org
7
Tak, jeśli zastąpisz /proc/sys/kernel/core_patternciąg rozpoczynający się od /tmp, to tam pójdą twoje zrzuty pamięci.
ephemient

Odpowiedzi:

240

Przeczytaj /usr/src/linux/Documentation/sysctl/kernel.txt .

[/ proc / sys / kernel /] core_pattern służy do określenia nazwy wzorca zrzutu pamięci.

  • Jeśli pierwszym znakiem wzorca jest „|”, jądro potraktuje resztę wzorca jako polecenie do uruchomienia. Zrzut rdzenia zostanie zapisany na standardowym wejściu tego programu zamiast do pliku.

Zamiast zapisywać zrzut pamięci na dysk, system jest skonfigurowany do wysyłania go do abrtprogramu. Narzędzie do automatycznego zgłaszania błędów prawdopodobnie nie jest tak udokumentowane, jak powinno ...

W każdym razie szybka odpowiedź jest taka, że ​​powinieneś być w stanie znaleźć swój podstawowy plik, w /var/cache/abrtktórym abrtprzechowuje go po wywołaniu. Podobnie, inne systemy wykorzystujące Apport mogą wpychać rdzenie /var/crashi tak dalej.

efemeryczny
źródło
30
tak, edytowałem core_pattern z następującą zawartością echa "core.% e.% p"> / proc / sys / kernel / core_pattern .. teraz tworzy plik zrzutu rdzenia w samym bieżącym katalogu. o nazwie „core.giis.12344” itd. Dziękujemy wszystkim za odpowiedzi / komentarze / wskazówki.
webminal.org,
20
Wystarczy zauważyć, że program fedora 18 abrt przechowuje zrzuty pamięci /var/spool/abrt/zamiast/var/cache/abrt
Nelson
4
Czy istnieje sposób, aby zezwolić użytkownikom na skonfigurowanie tego dla siebie, a nie dla wszystkich osób korzystających z konfiguracji systemu?
allyourcode
Czy po uruchomieniu tego polecenia i wywołaniu procesu stdout i stderr nie są domyślnie otwierane? Widzę, jak dzieją się dziwne rzeczy. kiedy używam dup2 stderr i stdout do mojego pliku niestandardowego (applog.txt), dane, które piszę do innego pliku (mycore.BIN) są przekierowywane do pliku, którego użyłem do przechwycenia stdout i stderr (applog.txt) . Czy jest o tym dobra lektura? Proszę zasugeruj. Dziękuję
mk ..
20
systemd w sklepach Archlinux Coredumps w/var/lib/systemd/coredump/
Francois
224

Na najnowszym Ubuntu (w moim przypadku 12.04) możliwe jest wydrukowanie „Błąd segmentacji (zrzut rdzenia)”, ale nie powstaje plik rdzenia, w którym można się spodziewać (na przykład dla programu kompilowanego lokalnie).

Może się to zdarzyć, jeśli masz podstawowy rozmiar pliku ulimit 0 (nie zrobiłeś tego ulimit -c unlimited) - jest to domyślny rozmiar w Ubuntu. Zwykle tłumiłoby to „(rdzeń zrzucony)”, wprowadzając cię w błąd, ale w Ubuntu pliki rdzeniowe są przesyłane do Apport (system zgłaszania awarii Ubuntu) przez /proc/sys/kernel/core_pattern, i wydaje się, że powoduje to mylący komunikat.

Jeśli Apport odkryje, że dany program nie jest tym, dla którego powinien zgłaszać awarie (w których się dzieje /var/log/apport.log), wraca do symulacji domyślnego zachowania jądra polegającego na umieszczeniu pliku podstawowego w cwd (odbywa się to w skrypcie /usr/share/apport/apport). Obejmuje to honorowanie ulimit, w którym to przypadku nic nie robi. Ale (zakładam), jeśli chodzi o jądro, został wygenerowany plik rdzenia (i przesłany do apportu), stąd komunikat „Błąd segmentacji (zrzut rdzenia)”.

Ostatecznie PEBKAC za to, że zapomniał ustawić ulimit, ale wprowadzająca w błąd wiadomość sprawiła, że ​​pomyślałem, że oszalałem przez chwilę, zastanawiając się, co zjadło moje pliki core.

(Ogólnie rzecz biorąc, strona podręcznika core (5) - man 5 core- jest dobrym źródłem informacji o tym, gdzie kończy się Twój plik podstawowy i jakie mogą być powody, dla których nie można go zapisać).

jtn
źródło
4
Dziękuję bardzo - napotkałem ten sam problem. Btw, Ubuntu 14.04 wykazuje dokładnie takie samo zachowanie, jak to opisałeś.
Malte Skoruppa,
5
W mojej instalacji Ubuntu (zmodyfikowanej 14.04) istnieje łatwe tymczasowe obejście tego problemu, uruchamiając sudo service apport stop--- po uruchomieniu zmieniłem /proc/sys/kernel/core_patternz potoku apport na just core. Przypuszczam, że Apport jest na tyle sprytny, by naprawić core_patterntymczasowo.
Patrick Collins
6
„ulimit -c unlimited” jest dokładnie tym, czego potrzebowałem - Dziękuję!
Dave C
4
Wypróbowałem każdą odpowiednią odpowiedź i każdą lokalizację w każdym komentarzu tutaj po wykonaniu polecenia ulimit, ale nadal nie mogę znaleźć pliku podstawowego nigdzie na moim Ubuntu 16.04 LTS ...
Nagev 05.04.17
2
@ElectricGoat Nie, nie mam. To kiepski projekt UX, IMO. System powinien po prostu wydrukować ścieżkę lub w ogóle nie drukować komunikatu, jeśli nie jest tworzony. Dodam własną odpowiedź, kiedy lub jeśli będę miał okazję zbadać to dalej.
Nagev
80

Wraz z uruchomieniem systemd pojawia się również inny scenariusz. Domyślnie systemd będzie zapisywał zrzuty rdzenia w swoim dzienniku, które są dostępne za pomocą systemd-coredumpctlpolecenia. Zdefiniowane w pliku core_pattern:

$ cat /proc/sys/kernel/core_pattern 
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e

To zachowanie można wyłączyć za pomocą prostego „włamania”:

$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core      # or just reboot

Jak zawsze, wielkość zrzutów rdzenia musi być równa lub większa niż wielkość zrzutu rdzenia, jak to zrobiono na przykład ulimit -c unlimited.

timss
źródło
Ten „hack” nie działał dla mnie (nawet po ponownym uruchomieniu). Używam Arch Linux i już uruchomiłem ulimit -c unlimited.
gsingh2011
@ gsingh2011 To może być nieaktualne. Nie prowadzę już Arch, więc nie mogę powiedzieć, czy to powinno zadziałać w dzisiejszych czasach. Jeśli się zorientujesz, możesz zaktualizować mnie / nas o nowy komentarz.
timss
5
@ gsingh2011 Spróbuj 50-coredump.confzamiast coredump.conf. To powinno zastąpić /lib/sysctl.d/50-coredump.conf. Domyślne ustawienie można przywrócić za pomocąsysctl -w kernel.core_pattern=core
Lekensteyn,
Musiałem wyłączyć appport, aby to zadziałałosudo service apport stop
rahul003
51

Pisanie instrukcji, aby uzyskać zrzut pamięci w Ubuntu 16.04 LTS :

  1. Jak wspomniał @jtn w swojej odpowiedzi, Ubuntu deleguje wyświetlanie awarii w celu przypisania , co z kolei odmawia zapisania zrzutu, ponieważ program nie jest zainstalowanym pakietem.Przed wprowadzeniem zmian

  2. Aby rozwiązać ten problem, musimy upewnić się, że apport zapisuje również pliki zrzutu pamięci dla programów innych niż pakiety . Aby to zrobić, utwórz plik o nazwie ~ / .config / apport / settings z następującą zawartością:
    [main] unpackaged=true

  3. Teraz ponownie zawiesić program i zobaczyć, jak generowane są pliki awarii w folderze: / var / crash o nazwach takich jak * .1000.crash . Zauważ, że te pliki nie mogą być odczytane bezpośrednio przez gdb .Po wprowadzeniu zmian
  4. [Opcjonalnie] Aby zrzuty były czytelne przez gdb, uruchom następującą komendę:

    apport-unpack <location_of_report> <target_directory>

Odnośniki: Core_dump - Oracle VM VirtualBox

ankurrc
źródło
3
To jedyne rozwiązanie, które działało dla mnie w Ubuntu 18.04
greuze
Który użytkownik dotyczy ~ / dotyczy? Jeśli proces jest uruchamiany przez root, czy to oznacza /root/.config/apport/settings?
Nicholi
@Nicholi Uważam, że to użytkownik powinien wykonać program. Nie jestem jednak pewien.
ankurrc
12

Mógłbym wymyślić dwie następujące możliwości:

  1. Jak już zauważyli inni, program może chdir(). Czy użytkownik uruchamiający program może zapisywać w katalogu, w którym był chdir()edytowany? Jeśli nie, nie może utworzyć zrzutu podstawowego.

  2. Z jakiegoś dziwnego powodu zrzut rdzenia nie jest nazwany. core.*Możesz to sprawdzić /proc/sys/kernel/core_pattern. Polecenie find, które podałeś, nie znalazłoby typowego zrzutu pamięci. Powinieneś użyć find / -name "*core.*", jak typowa nazwa rdzeniacore.$PID

ahans
źródło
oto mój wzorzec - czy to oznacza, że ​​plik rdzenia nosi nazwę „PID.signal.userid” zamiast core.pid ??? $ cat / proc / sys / kernel / core_pattern / usr / lib / hookCCpp / var / char / abrt% p% s% u
webminal.org
9

Jeśli brakuje podstawowych zrzutów plików binarnych na RHELi podczas korzystania abrt, upewnij się, że/etc/abrt/abrt-action-save-package-data.conf

zawiera

ProcessUnpackaged = yes

Umożliwia to tworzenie raportów o awariach (w tym zrzutów podstawowych) dla plików binarnych, które nie są częścią zainstalowanych pakietów (np. Budowanych lokalnie).

MRalwasser
źródło
6

Dla fedora25 mogłem znaleźć plik podstawowy na

/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump

gdzie ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %zgodnie z `/ proc / sys / kernel / core_pattern '

Mahadeer Darade
źródło
5

Moje wysiłki w WSL zakończyły się niepowodzeniem.

Dla tych, którzy korzystają z Windows Subsystem for Linux (WSL), wydaje się, że w tej chwili istnieje otwarty problem z brakującymi plikami zrzutu pamięci.

Komentarze wskazują na to

Jest to znany problem, o którym wiemy, że badamy go.

Problem z Githubem

Opinia programisty Windows

Brandon Søren Culley
źródło
5

W Ubuntu18.04 najłatwiejszym sposobem uzyskania pliku podstawowego jest wprowadzenie poniższej komendy, aby zatrzymać usługę apport.

sudo service apport stop

Następnie uruchom ponownie aplikację, otrzymasz plik zrzutu w bieżącym katalogu.

Nicolas Gong
źródło
3

Jestem na Linux Mint 19 (oparty na Ubuntu 18). Chciałem mieć coredumppliki w bieżącym folderze. Musiałem zrobić dwie rzeczy:

  1. Zmień /proc/sys/kernel/core_pattern(przez # echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_patternlub przez# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
  2. Zwiększenie limitu rozmiaru podstawowego pliku o $ ulimit -c unlimited

Zostało to napisane już w odpowiedziach, ale napisałem, by streścić zwięźle. Co ciekawe zmiana limitu nie wymagała uprawnień roota (zgodnie z /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root może tylko obniżyć limit, więc było to nieoczekiwane - komentarze na jego temat są mile widziane).

Marisha
źródło
2

ulimit -c unlimited sprawiło, że plik rdzenia poprawnie pojawił się w bieżącym katalogu po „zrzutu pamięci”.

Nicolas VERHELST
źródło