Mam duży program napisany w języku C# i działający na systemach Linux przy użyciu Mono, który sporadycznie ulega awarii i powoduje, że proces mono.bin
zrzuca rdzeń.Debugowanie post mortem programu skompilowanego w Mono AOT
Uruchomiłem gdb
na niektórych plikach zrzutu pamięci, ale nie było to zbyt przydatne, ponieważ ślady śledzenia nie mają w nich nazw funkcji C#. Według this discussion I found:
To nie zadziała. Informacje wymagane do utworzenia ścieżek zarządzanych są przechowywane w strukturach danych środowiska wykonawczego, a tylko są dostępne podczas działania programu. Możesz zgarnąć swoją aplikację, , a następnie będziesz mieć więcej użytecznych śladów stosu.
Tak, zrobiłem. I AOT-skompilował wszystkie moje pliki DLL i EXE. Korzystanie z opcji --aot=write-symbols
. Dla wersji testowej mojego programu, która jest crashes on purpose, dzięki czemu mógłbym sprawdzić, czy to czyni śledzenie bardziej użyteczne. I jak dotąd nie. Backtrace od głównego wątku wygląda następująco:
#0 0xb7fc8402 in __kernel_vsyscall()
#1 0x00556df0 in raise() from /lib/libc.so.6
#2 0x00558701 in abort() from /lib/libc.so.6
#3 0x080e59b5 in ??()
Kolejny wątek ma:
#0 0xb7fc8402 in __kernel_vsyscall()
#1 0x005f6753 in poll() from /lib/libc.so.6
#2 0xb6f735a7 in Mono_Unix_UnixSignal_WaitAny()
from /opt/novell/mono/lib/libMonoPosixHelper.so
#3 0xb5416578 in ??()
I inne wątki wydają się być w stanie bezczynności (w nanosleep
, pthread_cond_timedwait
, pthread_cond_wait
, sem_timedwait
lub sem_wait
). Ale rzeczą wspólną wszystkich śladów wstecz jest to, że kończą się tym irytującym in ??()
i nigdy nie wymieniają nazw funkcji z "mojego" kodu.
Myślę, że jest to związane z niektórymi komunikatami, które gdb
wydrukowały po uruchomieniu; na przykład
Reading symbols from /xyz/mono/log4net.dll.so...(no debugging symbols found)...done.
Loaded symbols for /xyz/mono/log4net.dll.so
Reading symbols from /xyz/mono/Contoso.Util.dll.so...(no debugging symbols found)...done.
Loaded symbols for /xyz/mono/Contoso.Util.dll.so
Reading symbols from /xyz/mono/Contoso.Printing.dll.so...(no debugging symbols found)...done.
Loaded symbols for /xyz/mono/Contoso.Printing.dll.so
Reading symbols from /xyz/mono/Contoso.LegacyDataConverter.dll.so...(no debugging symbols found)...done.
Loaded symbols for /xyz/mono/Contoso.LegacyDataConverter.dll.so
Dlaczego wszyscy *.dll.so
plików „nie znaleziono żadnych symboli debugowania”? Czy biblioteki DLL muszą być zbudowane w trybie "debugowania" czy coś takiego?
A ogólnie rzecz biorąc, czy istnieje sposób na pobranie śledzonego stosu z poziomu zrzutu pamięci Mono? (Bez użycia mono_pmip
, ponieważ jest to dostępne tylko wtedy, gdy proces jest uruchomiony.)
Powinieneś mieć pakiet w twoim repozytorium o nazwie "Mono Runtime - Debugging symbols" lub podobny. Znajdź, zainstaluj i spróbuj debugować. –
Istnieje pakiet o nazwie 'mono-addon-core-debuginfo' (dla CentOS). Zakładam, że to wszystko. – dan04
Jako ostatnia próba, jeśli naprawdę nie możesz tego naprawić, możesz uruchomić aplikację pod "winem"? Nie jest to idealne rozwiązanie, ale jeśli naprawdę utkniesz, może to zadziałać. – Rots