2017-02-06 14 views
24

Mam aplikację .NET, którą udostępniłem do .NET Core. Testuję to na Ubuntu 14.04.Jak zrzucić aplikację .NET Core w systemie Linux

Próbuję dowiedzieć się, jak uzyskać plik .dmp lub ekwiwalent systemu Linux, gdy program się zawiesza. Dzwonię pod numer Environment.FailFast, ale z tego co wiem, nie generuję pliku .dmp, tak jak w systemie Windows. Zgodnie z this caseEnvironment.FailFast powinien utworzyć zrzut, ale jeśli nie mogę go znaleźć.

Ponadto próbowałem ręcznie utworzyć zrzut przy użyciu gcore. Działa to jednak długo, aby wygenerować zrzut (moja aplikacja nie jest tak duża) i nie jestem w stanie uzyskać prawidłowych staków w gdb po fakcie, ponieważ kiedy wskażę gdb do mojej biblioteki aplikacji, to go nie rozpoznaje .

Jaki jest najlepszy sposób, aby uzyskać zrzut aplikacji .NET Core w systemie Linux?

Dzięki!

+0

Czy masz wpis w '/ var/crash'? Powinien utworzyć tam wpis, gdy aplikacja się zawiesza. –

+0

@MailailStancecu nope, '/ var/crash' jest pusty. – shortspider

Odpowiedz

3

chcesz zrzutu pamięci, jest on wbudowany w system operacyjny.

pierwszy ulimit -Sc unlimited jako użytkownik, który chcesz uruchomić proces, więc pozwala utworzyć plik core o dowolnym rozmiarze. Następnie kill -4 <pid>

To powinno wygenerować zrzut rdzenia. Prawdopodobnie powinien znajdować się w katalogu, w którym został uruchomiony proces.

Jeśli nie możesz się zalogować jako użytkownik, aplikacja działa jako, musisz umieścić to w pliku limits.conf.

+0

Uruchomiłem 'ulimit -Sc unlimited', a następnie uruchomiłem proces dotnet. Po uruchomieniu 'kill -4 ' nie mogłem znaleźć żadnego pliku zrzutu pamięci w lokalizacji dll lub 'var/crash' – shortspider

+0

Czy'/var/crash' jest zapisywalny przez użytkownika? (Powinien mieć ustawiony bit, ale niektóre dystrybucje go wyłączają.) – dond

+0

@dond yes użytkownik może pisać do '/ var/crash' – shortspider

3

Generowanie cypu linuxa definiowane jest przez to, co jest w /proc/sys/kernel/core_pattern. Jeśli określone sygnały (np. SIGSEGV lub SIGQUIT) powodują zakończenie procesu, obraz pamięci procesu jest zapisywany w tym pliku. Jeśli zaczyna się od symbolu rurki |, może być przesyłany strumieniowo do aplikacji, która wykonuje analizę zrzutów. Jest udokumentowane tutaj: http://man7.org/linux/man-pages/man5/core.5.html

Jeśli skonfigurować go tak: echo coredump > /proc/sys/kernel/core_pattern będzie napisać plik o nazwie coredump do bieżącego katalogu.

Jeśli skonfigurować go tak: echo "/tmp/cores/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern To utworzy plik jak /tmp/cores/core.bash.8539.drehbahn-mbp.1236975953 (patrz https://sigquit.wordpress.com/2009/03/13/the-core-pattern/)

Jak inni zasugerował również ustawić ulimit -S -c unlimited aby umożliwić coredumps o dowolnej wielkości.

Tutaj jest blog-post, który pokazuje, jak tworzyć i analizować coredumps NET rdzeń pod Linux: http://blogs.microsoft.co.il/sasha/2017/02/26/analyzing-a-net-core-core-dump-on-linux/

Powiązane problemy