Jak uzyskać zrzut rdzenia z Apache podczas segfaulta

13

Postępowałem zgodnie z instrukcjami z wielu lokalizacji w Internecie, jak uzyskać zrzut pamięci z Apache, gdy produkuje on segfault, ale nadal nie chce wygenerować zrzutu.

Mam:

  1. Dodano CoreDumpDirectorydyrektywę do httpd.confpliku i ustaw ją na/tmp
  2. Wykonany ulimit -c unlimited
  3. Podano wzór dla zrzutów przy użyciu echo '/tmp/core-%e.%p' > /proc/sys/kernel/core_pattern
  4. Również pobiegłem echo 0 > /proc/sys/kernel/core_uses_pid

Httpd został zrestartowany, ale nadal nie utworzono żadnych zrzutów.

Używam CentOS 5.8 x64 z httpd-2.2.3-65.el5.centos.3iphp-5.3.20-13.el5.art

Każda pomoc będzie mile widziana!

chrismcb
źródło
Czy apache ma jakieś uprawnienia do zapisu do pliku określonego w dyrektywie CoreDumpDirectory? Powinien być własnością apache.
Valentin Bajrami,
Ustawiłem
Dzięki - to spowodowało zrzut, ale nie w miejscu, w którym go ustawiłem! I ustawić CoreDumpDirectorysię /tmp/dumpsi rzucił do /tmp... teraz na debugowania
chrismcb
Cieszę się, że to rozgryzłeś!
Valentin Bajrami,

Odpowiedzi:

7

Moja odpowiedź brzmi:

  1. Skonfiguruj dyrektywę w następujący sposób

    CoreDumpDirectory /tmp/mycoredump

  2. Utwórz katalog:

    mkdir -p /tmp/mycoredump

  3. Przypisywanie własności do katalogu www-data lub httpd

    chown -R www-data:www-data /tmp/mycoredump

  4. Ustaw uprawnienia na:

    chmod 777 /tmp/mycoredump

  5. Uruchom ponownie Apache:

    service apache2 restart

Valentin Bajrami
źródło
Tak, właśnie to zrobiłem, ale i tak to się skończyło /tmp!
chrismcb,
6
To nigdy nie jest dobry pomysł, aby chmod 777cokolwiek
sendmoreinfo
1
@sendmoreinfo Ale co, jeśli Twój przypadek użycia sprawia, że ​​coś jest w pełni modyfikowalne i wykonalne dla świata zewnętrznego? ;-)
avgvstvs
8
Możesz strzelać sobie w stopę, tylko tego nie głosz.
sendmoreinfo
0

Zauważ, że jeśli PrivateTmp=trueustawiłeś w swoim /usr/lib/systemd/system/apache2.service(lub jakkolwiek to się nazywa w twoim systemie), co oznacza, że ​​Apache faktycznie szuka /tmpwewnątrz czegoś takiego /tmp/systemd-private-c27fc5b152d546159d675e170641529b-apache2.service-IcEt0m/, Apache nie będzie mógł pisać do tego katalogu i nie zostanie w ogóle zrzucony rdzeń (z powodu do systemdkatalogu tmp mającego 700 uprawnień tylko do rootowania).

Rozwiązaniem jest ustawienie PrivateTmp=falselub zmodyfikowanie uprawnień do katalogu systemd tmp po uruchomieniu serwera.

Zmarnowałem na to godziny, by dopiero teraz wreszcie zrozumieć, na czym polega problem.

Artem Russakovskii
źródło