Jak zbierać zrzuty pamięci dla Firebirda na Linuksie i generować ślady stosu
Wprowadzenie
W przypadku poważnego problemu z Firebirdem, takiego jak zawieszenie lub nieprawidłowe zakończenie działania, konieczne jest skonfigurowanie zbierania zrzutów pamięci, a następnie utworzenie śladów stosu. Dzięki zrzutom i śladom stosu główni programiści Firebirda z IBSurgeon mogą przeanalizować szczegółowy obraz zawieszenia/awarii i zaproponować rozwiązanie.
| Analiza zrzutów i śladów stosu jest dostępna w ramach zaawansowanej usługi technicznego wsparcia Firebird od IBSurgeon. Nasze plany zaczynają się od 199 USD/serwer/miesiąc i obejmują wsparcie przez czat (WhatsApp, Telegram itp.), więc w przypadku poważnego problemu otrzymasz profesjonalną pomoc niemal natychmiast. Aby uzyskać szczegóły, odwiedź: /pl/enterprise-subscription-plans-for-firebird/ |
| Wszystkie poniższe czynności wymagają uprawnień root lub sudoer. |
1. Wymagania wstępne
1.1 Usuń lub zatrzymaj kolidujące pakiety
Ubuntu/Debian
- systemd-coredump
apt-get purge --auto-remove systemd-coredump
Aby zweryfikować usunięcie:
cat /proc/sys/kernel/core_pattern
Nie powinno być wyniku takiego jak:
/lib/systemd/systemd-coredump%P %u %g %s %t %e
- apport
# Wyszukiwanie
service --status-all | grep -m1 -i apport
# Symulacja usunięcia
apt-get -s remove apport
# Usunięcie
sudo apt-get remove apport
# Czyszczenie pozostałych plików
sudo apt-get purge apport
CentOS/RedHat
- abrtd
Aby sprawdzić:
cat /proc/sys/kernel/core_pattern
Jeśli widzisz wynik taki jak:
/usr/libexec/abrt-hook-ccpp %s %c %p %u %g%t e %P %I
Zatrzymaj i usuń abrtd:
Dla CentOS 6:
service abrtd stop
Dla CentOS 7:
systemctl disable abrtd.service
Usuń:
yum -y remove abrt*
# Czyszczenie pozostałych plików
rm -r /var/cache/abrt/
# Weryfikacja czyszczenia
cat /var/log/yum.log | grep abrt
1.2 Zainstaluj GDB
| GDB jest wymagany do tworzenia śladów stosu z zebranych zrzutów. Instalacja GDB nie wpływa na wydajność ani nie przełącza Firebirda w tryb “debug”. |
Dla CentOS:
yum install gdb
Dla Ubuntu/Debian:
apt-get install gdb
2. Usuń ograniczenia rozmiaru zrzutów
Sprawdź aktualny limit rozmiaru zrzutu:
ulimit -c
Jeśli widzisz 0, tworzenie zrzutów jest zabronione.
Dla systemów z systemd zmodyfikuj plik usługi:
CentOS/RedHat
/usr/lib/systemd/system/firebird-superserver.service
Ubuntu/Debian
/lib/systemd/system/firebird-superserver.service
Dodaj do sekcji [Service]:
LimitCORE=infinity
Uruchom ponownie usługi:
systemctl daemon-reload
systemctl restart firebird-superserver.service
Zweryfikuj nieograniczony rozmiar zrzutu:
strings /proc/$(pgrep firebird)/limits
3. Skonfiguruj lokalizację i nazewnictwo plików zrzutów
| Ten krok jest opcjonalny, ale wysoce zalecany, aby określić znaczące nazwy plików zrzutów i zapewnić odpowiednią przestrzeń dyskową. |
Konfiguracja tymczasowa
sysctl -w kernel.core_pattern=/ścieżka/do/zrzutów/core.%e.%t.%p
Konfiguracja stała
Dodaj do /etc/sysctl.conf:
kernel.core_pattern=/ścieżka/do/zrzutów/core.%e.%t.%p
Ustaw właściciela
chown firebird /ścieżka/do/zrzutów -R
4. Przetestuj zbieranie zrzutów
Wymagania wstępne
-
Uruchom ponownie SSH
-
Sprawdź, czy
ulimit -czwraca “unlimited”
Polecenia testowego awarii
Firebird 3+ (SuperServer lub SuperClassic)
echo "shell kill -6 $(pgrep firebird);" | /opt/firebird/bin/isql -q localhost:employee -user sysdba -pas masterkey
Firebird 2.5 (SuperClassic)
echo "shell kill -6 $(pgrep fb_smp_server);" | /opt/firebird/bin/isql -q localhost:employee -user sysdba -pas masterkey
Tryb Classic
select mon$server_pid from mon$attachments where mon$attachment_id = current_connection;
shell kill -6 <znaleziony_PID>;
5. Zainstaluj pliki debug
| - Pliki debug muszą odpowiadać wersji Twojej kompilacji Firebirda - Instalacja plików debug nie wpływa na wydajność - Aktualizuj pliki debug przy aktualizacji Firebirda |
Oczekiwane lokalizacje plików debug:
/opt/firebird/bin/.debug/firebird.debug
/opt/firebird/bin/.debug/gbak.debug
/opt/firebird/bin/.debug/isql.debug
/opt/firebird/lib/.debug/libfbclient.so.3.0.11.debug
/opt/firebird/lib/.debug/libib_util.so.debug
/opt/firebird/plugins/.debug/libfbtrace.so.debug
/opt/firebird/plugins/.debug/libEngine12.so.debug
| Instalacje HQbird zawierają poprawne pliki debug i automatycznie obsługują aktualizacje. |
6. Utwórz ślady stosu z działających procesów
- Utwórz
gdb-commands.txt:
thread apply all bt
quit
yes
- Wygeneruj ślad stosu:
gdb -q -x ./gdb-commands.txt /opt/firebird/bin/firebird $(pgrep firebird) 1>./stacktrace.txt 2>&1
7. Utwórz zrzut z działającego procesu
gcore -o /ścieżka/do/zrzutów/firebirdprefix $(pgrep firebird)
| Narzędzie doda identyfikator procesu do prefiksu. |
8. Utwórz ślad stosu z istniejącego zrzutu
gdb -q -x ./gdb-commands.txt /opt/firebird/bin/firebird /tmp/core.firebird.23041 1>./stacktrace1.txt 2>&1
9. Dogłębna analiza zrzutu
Aby przeanalizować biblioteki współdzielone:
echo -e "info sharedlibrary\nquit\n" | gdb