2012-01-12 15 views
5

Czy mogę skonfigurować, co dzieje się z zrzutem rdzenia w systemie Linux? Chcę uzyskać coś w rodzaju mini-zrzutów systemu Windows (minimalna informacja o ramce stosu, gdy aplikacja uległa awarii). Wiem, że możesz ustawić maksymalny rozmiar plików podstawowych przy użyciu ulimit, ale to nie pozwala mi kontrolować, co wchodzi w rdzeń (tj. Nie ma gwarancji, że jeśli ustawię limit na 64 kb, zrzuci on ostatnie 16 stron stos, na przykład).Minimalny zrzut rdzenia (śledzenie stosu + aktualna ramka)

Chciałbym również ustawić programowo (z kodu), jeśli to możliwe. Spojrzałem na plik /proc/PID/coredump_filter wymieniony przez man core, ale wydaje się zbyt gruboziarnisty dla moich celów.

Aby zapewnić mały kontekst: Potrzebuję małych plików podstawowych z wielu powodów: muszę je zebrać w sieci, dla wielu (tysięcy) klientów; ponadto są to urządzenia wbudowane z niewielkimi kartami SD i modemy GPRS do połączenia sieciowego. Tak więc wszystko powyżej 200 000 jest wykluczone.

EDYCJA: Pracuję na urządzeniu osadzonym, które działa pod Linuksem 2.6.24. Procesor to PowerPC. Niestety, PowerPC Linux jest nie obsługiwane breakpad w tej chwili, więc google breakpad nie jest opcją

+1

Nie mam pojęcia, a odpowiedź leży prawdopodobnie w kodzie źródłowym jądra (ponieważ nie ma z tym żadnej specyfikacji). Dlaczego pytasz? W przypadku obecnych dysków limit zrzutu pamięci o wartości 64 Mb jest nadal mały i prawdopodobnie zawierałby wystarczającą ilość informacji. Dlaczego musisz ustawić limit tak małej wartości jak 64 kb. ? –

+3

Google Breakpad pisze minizrzuty na wszystkich platformach, w tym na Linuksie. –

+0

Pytam, ponieważ korzystam z urządzenia osadzonego, które ma mały dysk flash, a szczególnie wolne połączenie GPRS do pobierania danych. Chcę, aby był jak najmniejszy! –

Odpowiedz

5

mam "rozwiązać" ten problem na dwa sposoby:

  1. Zainstalowałem procedurę obsługi sygnału dla SIGSEGV i użyłem symboli śledzenia wstecznego/śledzenia wstecznego do wydrukowania śledzenia stosu. Skompilowałem swój kod za pomocą -rdynamic, więc nawet po usunięciu informacji o debugowaniu nadal otrzymuję ślad zwrotny o znaczących nazwach (przy zachowaniu wystarczająco kompaktowego pliku wykonywalnego).
    Usunąłem informacje debugowania i umieściłem je w osobnym pliku, który będę przechowywać w bezpiecznym miejscu, używając strip; stamtąd użyję add22line z informacjami zapisanymi na podstawie śledzenia wstecznego (adresów), aby zrozumieć, gdzie wystąpił problem. W ten sposób muszę przechowywać tylko kilka bajtów.
  2. Alternatywnie, znalazłem, że mogę użyć/proc/self/coredump_filter do zrzutu pamięci (ustawiając jej zawartość na "0"): tylko wątek i informacje proc, rejestry, stacktrace itp. Są zapisywane w rdzeniu. Zobacz więcej w this answer

Nadal tracę informacje, które mogą być cenne (zawartość globalna i zmienna lokalna, parametry ...). Mogłabym łatwo określić, które strony mają zostać zrzucone, ale niestety nie ma sposobu na określenie "zrzut-tych stron" dla normalnych zrzutów rdzenia (chyba że jesteś gotów pójść i załatać funkcję maydump() w jądrze).

Na razie jestem bardzo zadowolony z rozwiązań tam 2 (jest to lepsze niż nic ..) Mój następny ruchy będą:

  • zobaczyć, jak trudne byłoby do portu Breakpad PowerPC Linux: istnieją już powerpc-darwin i i386-linux, więc .. jak trudne może być? :)
  • spróbuj użyć google-coredumper, aby zrzucić tylko kilka stron wokół bieżącego ESP (to powinno dać mi miejscowych i parametrów) i wokół "& some_global" (to powinno dać mi globals).
+0

Podczas gdy łatwo byłoby rozwidlić google-coredumper i zmodyfikować funkcję 'WriteCoreDump', aby zrzucić określone strony/adresy .. nie ma wsparcia dla powerpc :( –

Powiązane problemy