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:

  1. rdzeń wzór
  2. core_uses_pid
  3. ulimit -c nieograniczony
  4. 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.

1
davidbobo 24 lipiec 2011, 23:49
Czy twój program to setuid czy setgid? jeśli tak, jaka jest zawartość /proc/sys/fs/suid_dumpable?
 – 
Hasturkun
25 lipiec 2011, 14:04
Mój program nie jest setuid ani setgid, jeśli masz na myśli, że ls -l odpowiedź zaczyna się od s, a żądany plik to 1
 – 
davidbobo
25 lipiec 2011, 15:05
Ok, czy używa gdzieś funkcji seteuid() lub setguid()? 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
 – 
Hasturkun
25 lipiec 2011, 15:17
Czy Twój mały program awaryjny i ten drugi znajdują się na partycji z możliwością zapisu? Możesz określić zrzut pamięci do umieszczenia na partycji z możliwością zapisu za pomocą core_pattern
 – 
Patrice Tisserand
26 lipiec 2011, 01:25

3 odpowiedzi

Najlepsza odpowiedź

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.

4
user149341user149341 25 lipiec 2011, 00:04
Ok - w linku, który mi podałeś, jest napisane, aby zmienić ELF ... przejdź do ustawień ogólnych. Nie wiem, gdzie jest ogólna konfiguracja, brzmi jak GUI. Nie mam gui, pracuję na wbudowanym systemie. Dzięki
 – 
davidbobo
25 lipiec 2011, 10:48
@davidbobo: w konfiguracji jądra, z katalogu źródeł jądra uruchom make menuconfig, ciesz się swoim CLI. nie zapomnij przebudować swojego jądra.
 – 
Hasturkun
25 lipiec 2011, 13:57
Możesz także określić, czy twoje jądro jest skompilowane z włączonym zrzutem pamięci: zcat /proc/config.gz | grep CONFIG_COREDUMP
 – 
Mubin Icyer
30 marzec 2021, 11:59

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.

0
davidbobo 28 lipiec 2011, 16:50

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.

-1
dolphy 25 lipiec 2011, 00:04