Pracuję na komputerze PC z systemem operacyjnym CentOS. Pracuję również na osadzonym systemie z tym samym systemem operacyjnym.
Na moim komputerze udało mi się utworzyć plik zrzutu pamięci w przypadku błędu segmentacji, zmieniając:
- rdzeń wzór
- core_uses_pid
- ulimit -c nieograniczony
- sysctl -p.
Ale w systemie wbudowanym nic nie działa - zrzut pamięci nie jest generowany! Jaki może być powód?
Jeśli ma to znaczenie, aplikacja, którą chciałbym zrzucić, jest napisana w C++.
Co mogę zrobić, aby uzyskać zrzut pamięci w systemie wbudowanym?
Zrobiłem mały program awaryjny, a zrzut pamięci jest generowany z programu awaryjnego, ale nie dla tego, którego potrzebuję !!! Więc problem nie dotyczy systemu operacyjnego, ale konkretnego programu. Odkryłem, że usuwamy pliki wykonywalne/biblioteczne -g przed wysłaniem ich do systemu osadzonego. Zrobiłem to samo dla mojego programu awaryjnego, a ten nadal generuje zrzut pamięci.
3 odpowiedzi
Czy jesteś pewien, że jądro Twojego systemu wbudowanego obsługuje zrzuty pamięci? Tę funkcję można wyłączyć w kompilacji jądra ( ref). wywrotka.
make menuconfig
, ciesz się swoim CLI. nie zapomnij przebudować swojego jądra.
zcat /proc/config.gz | grep CONFIG_COREDUMP
Ok,
Popełniłem mały błąd sprawdzając ich program na moim komputerze, sprawdziłem go innym sygnałem niż w systemie osadzonym. Nadal występował problem, dlaczego dla niestandardowego programu obsługi sygnału nie ma zrzutu pamięci. Rozwiązanie znajduje się w jednym z linków:
Niestety, jeśli twoja aplikacja jest wyposażona w niestandardową procedurę obsługi sygnału, nie zostanie wygenerowany zrzut pamięci, ponieważ jest on generowany tylko przez domyślne procedury obsługi sygnału. Jeśli Twoja aplikacja ma niestandardowy program obsługi sygnałów, wyłącz go przed rozpoczęciem debugowania, w przeciwnym razie nie zostanie wygenerowany zrzut pamięci. Niektóre źródła w Internecie wspominają, że przywrócenie domyślnego modułu obsługi sygnału wewnątrz modułu obsługi sygnału po wystąpieniu wyjątku i ponowne wysłanie go w pętli zwrotnej może wywołać zrzut pamięci. W testach, które wykonałem, wygenerował zrzut rdzenia, ale jedyną rzeczą, którą zobaczyłem w zrzucie rdzenia, był kod, który wykonał mój program obsługi (tj. wywołania sygnału i zabicia), więc to mi nie pomogło. Być może na innych platformach ta sztuczka działa lepiej.
Na mojej platformie to działa - innym rozwiązaniem byłoby wygenerowanie zrzutu pamięci w module obsługi sygnału. Słyszałem, że gcore może to zrobić, z rdzeniem systemu Windows otrzymałem błąd niezgodności.
Widziałem dwa źródła możliwych informacji, z których oba wskazują na plik /etc/security/limits.conf
:
Linux Wyłącz zrzuty rdzenia – Tak, wiem, że chcesz włącz zrzuty pamięci, ale może to pomóc w odwrotnej sytuacji CentOS włączający zrzuty pamięci — inne źródło wskazujące na limits.conf
.
Podobne pytania
Nowe pytania
linux
PYTANIA LINUX MUSZĄ BYĆ ZWIĄZANE Z PROGRAMOWANIEM. Użyj tego tagu tylko wtedy, gdy Twoje pytanie dotyczy programowania przy użyciu interfejsów API systemu Linux lub zachowania specyficznego dla systemu Linux, a nie tylko dlatego, że zdarzyło Ci się uruchomić kod w systemie Linux. Jeśli potrzebujesz wsparcia dla systemu Linux, możesz wypróbować https://unix.stackexchange.com lub witrynę Stack Exchange określonej dystrybucji Linuksa, taką jak https://askubuntu.com lub https://elementaryos.stackexchange.com/
/proc/sys/fs/suid_dumpable
?seteuid()
lubsetguid()
? ponieważ domyślnie byłoby to nie do zrzucenia. jeśli tak, spróbuj zrobićecho 2 > /proc/sys/fs/suid_dumpable
, co może umożliwić zrzucenie rdzenia