Debugowanie błędów stackOverflow
Element jest StackOverflowException zgłaszany, gdy stos wykonywania przepełnia się, ponieważ zawiera zbyt wiele wywołań metody zagnieżdżonej.
Załóżmy na przykład, że masz aplikację w następujący sposób:
using System;
namespace temp
{
class Program
{
static void Main(string[] args)
{
Main(args); // Oops, this recursion won't stop.
}
}
}
Metoda Main
będzie stale wywoływać się, dopóki nie ma więcej miejsca na stos. Gdy nie ma więcej miejsca na stosie, wykonanie nie może kontynuować i dlatego zgłosi błąd StackOverflowException.
> dotnet run
Stack overflow.
Uwaga
W programie .NET 5 lub nowszym stos wywołań jest wyprowadzany do konsoli programu .
Uwaga
W tym artykule opisano sposób debugowania przepełnienia stosu przy użyciu bazy danych lldb. Jeśli korzystasz z systemu Windows, zalecamy debugowanie aplikacji za pomocą programu Visual Studio lub Visual Studio Code.
Przykład
Uruchamianie aplikacji skonfigurowanej do zbierania zrzutu w przypadku awarii
> export DOTNET_DbgEnableMiniDump=1 > dotnet run Stack overflow. Writing minidump with heap to file /tmp/coredump.6412 Written 58191872 bytes (14207 pages) to core file
Uwaga
Program .NET 6 ustandaryzuje prefiks
DOTNET_
zamiastCOMPlus_
zmiennych środowiskowych, które konfigurują zachowanie czasu wykonywania platformy .NET.COMPlus_
Jednak prefiks będzie nadal działać. Jeśli używasz poprzedniej wersji środowiska uruchomieniowego platformy .NET, nadal należy użyć prefiksuCOMPlus_
dla zmiennych środowiskowych.Instalowanie rozszerzenia SOS przy użyciu polecenia dotnet-sos
dotnet-sos install
Debugowanie zrzutu w bazie danych lldb w celu wyświetlenia stosu zakończonego niepowodzeniem
lldb --core /temp/coredump.6412 (lldb) bt ... frame #261930: 0x00007f59b40900cc frame #261931: 0x00007f59b40900cc frame #261932: 0x00007f59b40900cc frame #261933: 0x00007f59b40900cc frame #261934: 0x00007f59b40900cc frame #261935: 0x00007f5a2d4a080f libcoreclr.so`CallDescrWorkerInternal at unixasmmacrosamd64.inc:867 frame #261936: 0x00007f5a2d3cc4c3 libcoreclr.so`MethodDescCallSite::CallTargetWorker(unsigned long const*, unsigned long*, int) at callhelpers.cpp:70 frame #261937: 0x00007f5a2d3cc468 libcoreclr.so`MethodDescCallSite::CallTargetWorker(this=<unavailable>, pArguments=0x00007ffe8222e7b0, pReturnValue=0x0000000000000000, cbReturnValue=0) at callhelpers.cpp:604 frame #261938: 0x00007f5a2d4b6182 libcoreclr.so`RunMain(MethodDesc*, short, int*, PtrArray**) [inlined] MethodDescCallSite::Call(this=<unavailable>, pArguments=<unavailable>) at callhelpers.h:468 ...
Górna ramka
0x00007f59b40900cc
jest powtarzana kilka razy. Użyj polecenia SOSip2md
, aby dowiedzieć się, jaka metoda znajduje się pod0x00007f59b40900cc
adresem(lldb) ip2md 0x00007f59b40900cc MethodDesc: 00007f59b413ffa8 Method Name: temp.Program.Main(System.String[]) Class: 00007f59b4181d40 MethodTable: 00007f59b4190020 mdToken: 0000000006000001 Module: 00007f59b413dbf8 IsJitted: yes Current CodeAddr: 00007f59b40900a0 Version History: ILCodeVersion: 0000000000000000 ReJIT ID: 0 IL Addr: 0000000000000000 CodeAddr: 00007f59b40900a0 (MinOptJitted) NativeCodeVersion: 0000000000000000 Source file: /temp/Program.cs @ 9
Przejdź do wskazanej metody temp. Program.Main(System.String[]) i źródło "/temp/Program.cs @ 9", aby sprawdzić, czy możesz ustalić, co zrobiłeś źle. Jeśli nadal nie było jasne, możesz dodać rejestrowanie w tym obszarze kodu.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla