Ta strona została przetłumaczona maszynowo. Przeczytaj oryginał angielski. English

Biblioteka IBSurgeon

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
Code
apt-get purge --auto-remove systemd-coredump

Aby zweryfikować usunięcie:

Code
cat /proc/sys/kernel/core_pattern

Nie powinno być wyniku takiego jak:

Code
/lib/systemd/systemd-coredump%P %u %g %s %t %e
  • apport
Code
# 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ć:

Code
cat /proc/sys/kernel/core_pattern

Jeśli widzisz wynik taki jak:

Code
/usr/libexec/abrt-hook-ccpp %s %c %p %u %g%t e %P %I

Zatrzymaj i usuń abrtd:

Dla CentOS 6:

Code
service abrtd stop

Dla CentOS 7:

Code
systemctl disable abrtd.service

Usuń:

Code
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:

Code
yum install gdb

Dla Ubuntu/Debian:

Code
apt-get install gdb

2. Usuń ograniczenia rozmiaru zrzutów

Sprawdź aktualny limit rozmiaru zrzutu:

Code
ulimit -c

Jeśli widzisz 0, tworzenie zrzutów jest zabronione.

Dla systemów z systemd zmodyfikuj plik usługi:

CentOS/RedHat

Code
/usr/lib/systemd/system/firebird-superserver.service

Ubuntu/Debian

Code
/lib/systemd/system/firebird-superserver.service

Dodaj do sekcji [Service]:

Code
LimitCORE=infinity

Uruchom ponownie usługi:

Code
systemctl daemon-reload
systemctl restart firebird-superserver.service

Zweryfikuj nieograniczony rozmiar zrzutu:

Code
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

Code
sysctl -w kernel.core_pattern=/ścieżka/do/zrzutów/core.%e.%t.%p

Konfiguracja stała

Dodaj do /etc/sysctl.conf:

Code
kernel.core_pattern=/ścieżka/do/zrzutów/core.%e.%t.%p

Ustaw właściciela

Code
chown firebird /ścieżka/do/zrzutów -R

4. Przetestuj zbieranie zrzutów

Wymagania wstępne

  1. Uruchom ponownie SSH

  2. Sprawdź, czy ulimit -c zwraca “unlimited”

Polecenia testowego awarii

Firebird 3+ (SuperServer lub SuperClassic)

Code
echo "shell kill -6 $(pgrep firebird);" | /opt/firebird/bin/isql -q localhost:employee -user sysdba -pas masterkey

Firebird 2.5 (SuperClassic)

Code
echo "shell kill -6 $(pgrep fb_smp_server);" | /opt/firebird/bin/isql -q localhost:employee -user sysdba -pas masterkey

Tryb Classic

Code
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:

Code
/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

  1. Utwórz gdb-commands.txt:
Code
thread apply all bt
quit
yes
  1. Wygeneruj ślad stosu:
Code
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

Code
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

Code
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:

Code
echo -e "info sharedlibrary\nquit\n" | gdb