Utilitas pengumpulan dan analisis crash dump (dotnet-dump)
Artikel ini berlaku untuk: ✔️ dotnet-dump
versi 3.0.47001 dan versi yang lebih baru
Catatan
dotnet-dump
untuk macOS hanya didukung dengan .NET 5 dan versi yang lebih baru.
Instal
Ada dua cara untuk mengunduh dan menginstal dotnet-dump
:
alat global dotnet:
Untuk menginstal versi rilis terbaru paket
dotnet-dump
NuGet, gunakan perintah penginstalan alat dotnet:dotnet tool install --global dotnet-dump
Pengunduhan langsung:
Unduh alat yang dapat dijalankan yang cocok dengan platform Anda:
OS Platform Windows x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Catatan
Untuk menggunakan dotnet-dump
pada aplikasi x86, Anda memerlukan alat versi x86 yang sesuai.
Sinopsis
dotnet-dump [-h|--help] [--version] <command>
Deskripsi
Alat dotnet-dump
global adalah cara untuk mengumpulkan dan menganalisis cadangan di Windows, Linux, dan macOS tanpa debugger asli yang terlibat. Alat ini penting pada platform seperti Alpine Linux di mana lldb
yang bekerja secara penuh tidak tersedia. Alat dotnet-dump
ini memungkinkan Anda menjalankan perintah SOS untuk menganalisis crash dan pengumpul sampah (GC), tetapi ini bukan debugger asli sehingga hal-hal seperti menampilkan bingkai tumpukan asli tidak didukung.
Opsi
--version
Menampilkan versi utilitas dotnet-dump.
-h|--help
Tampilkan bantuan baris perintah.
Perintah
Perintah |
---|
dotnet-dump collect |
dotnet-dump analyze |
dotnet-dump ps |
dotnet-dump collect
Mengambil cadangan dari proses.
Sinopsis
dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag] [--crashreport]
Opsi
-h|--help
Tampilkan bantuan baris perintah.
-p|--process-id <PID>
Menentukan nomor ID proses untuk mengumpulkan crash dump.
-n|--name <name>
Menentukan nomor ID proses untuk mengumpulkan crash dump.
--type <Full|Heap|Mini>
Menentukan jenis crash dump, yang menentukan jenis informasi yang dikumpulkan dari proses. Terdapat tiga jenis:
Full
- Crash dump terbesar yang berisi semua memori termasuk gambar modul.Heap
- Crash dump besar dan relatif komprehensif yang berisi daftar modul, daftar utas, semua tumpukan, informasi pengecualian, menangani informasi, dan semua memori kecuali untuk gambar yang dipetakan.Mini
- Crash dump kecil yang berisi daftar modul, daftar utas, informasi pengecualian, dan semua tumpukan.
Jika tidak ditentukan,
Full
adalah default.-o|--output <output_dump_path>
Jalur lengkap dan nama file tempat crash dump yang dikumpulkan harus ditulis. Pastikan bahwa pengguna tempat proses dotnet berjalan memiliki izin tulis ke direktori yang ditentukan.
Jika tidak ditentukan:
- Defaults ke .\dump_YYYYMMDD_HHMMSS.dmp di Windows.
- Default ke ./core_YYYYMMDD_HHMMSS di Linux dan macOS.
YYYYMMDD adalah Tahun/Bulan/Hari dan HHMMSS adalah Jam/Menit/Detik.
--diag
Mengaktifkan pembuatan log diagnostik pengumpulan crash dump.
--crashreport
Mengaktifkan pembuatan laporan crash.
Catatan
Di Linux dan macOS, perintah ini mengharapkan aplikasi target dan dotnet-dump
untuk membagikan variabel lingkungan TMPDIR
yang sama. Jika tidak, perintah akan kehabisan waktu.
Catatan
Untuk mengumpulkan crash dump menggunakan dotnet-dump
, metrik perlu dijalankan sebagai pengguna yang sama dengan pengguna yang menjalankan proses target atau sebagai akar. Jika tidak, alat akan gagal membuat koneksi dengan proses target.
dotnet-dump analyze
Memulai shell interaktif untuk menjelajahi cadangan. Shell menerima berbagai perintah SOS.
Sinopsis
dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]
Argumen
<dump_path>
Menentukan jalur ke file crash dump untuk dianalisis.
Opsi
-c|--command <debug_command>
Menjalankan perintah saat mulai. Beberapa instans parameter ini dapat digunakan dalam pemanggilan untuk menautkan perintah. Perintah akan dijalankan dalam urutan yang disediakan pada baris perintah. Jika Anda ingin dotnet dump keluar setelah perintah, perintah terakhir Anda harus 'exit'.
Menganalisis perintah SOS
Perintah | Fungsi |
---|---|
analyzeoom |
Menampilkan info OOM terakhir yang terjadi pada permintaan alokasi ke tumpukan GC. |
clrmodules |
Mencantumkan modul terkelola dalam proses. |
clrstack |
Menyediakan jejak tumpukan kode terkelola saja. |
clrthreads |
Mencantumkan utas terkelola yang sedang berjalan. |
clru |
Menampilkan pembongkaran yang dianotasi dari metode terkelola. |
d atau readmemory |
Mencadangkan isi memori. |
dbgout |
Mengaktifkan/menonaktifkan (-off ) pengelogan SOS internal. |
dso |
Menampilkan semua objek terkelola yang ditemukan di dalam batas tumpukan saat ini. |
dumpalc |
Menampilkan detail tentang AssemblyLoadContext yang dikumpulkan tempat objek yang ditentukan dimuat. |
dumparray |
Menampilkan detail tentang array terkelola. |
dumpasync |
Menampilkan info tentang mesin status asinkron pada tumpukan yang dikumpulkan sampah. |
dumpassembly |
Menampilkan detail tentang rakitan. |
dumpclass |
Menampilkan informasi tentang struktur EEClass pada alamat yang ditentukan. |
dumpconcurrentdictionary |
Menampilkan isi kamus bersamaan. |
dumpconcurrentqueue |
Menampilkan isi antrean bersamaan. |
dumpdelegate |
Menampilkan informasi tentang delegasi. |
dumpdomain |
Menampilkan informasi tentang semua rakitan dalam semua AppDomains atau yang ditentukan. |
dumpgcdata |
Menampilkan informasi tentang data GC. |
dumpgen |
Menampilkan isi timbunan untuk pembuatan yang ditentukan. |
dumpheap |
Menampilkan informasi tentang tumpukan sampah dan statistik pengumpulan tentang objek. |
dumpil |
Menampilkan bahasa perantara umum (CIL) yang terkait dengan metode terkelola. |
dumplog |
Menulis konten log tekanan dalam memori ke file yang ditentukan. |
dumpmd |
Menampilkan informasi tentang struktur MethodDesc pada alamat yang ditentukan. |
dumpmodule |
Menampilkan informasi tentang modul pada alamat yang ditentukan. |
dumpmt |
Menampilkan informasi tentang tabel metode pada alamat yang ditentukan. |
dumpobj |
Menampilkan info objek pada alamat yang ditentukan. |
dumpruntimetypes |
Menemukan semua objek System.RuntimeType di tumpukan GC dan mencetak nama jenis dan MethodTable yang mereka rujuk juga. |
dumpsig |
Mencadangkan tanda tangan metode atau bidang yang ditentukan oleh <sigaddr> <moduleaddr> . |
dumpsigelem |
Mencadangkan satu elemen objek tanda tangan. |
dumpstackobjects |
Menampilkan semua objek terkelola yang ditemukan di dalam batas tumpukan saat ini. |
dumpvc |
Menampilkan info tentang bidang kelas nilai. |
eeheap |
Menampilkan informasi tentang memori proses yang digunakan oleh struktur data runtime bahasa umum internal. |
eestack |
dumpstack Berjalan pada semua utas dalam proses. |
eeversion |
Menampilkan informasi tentang versi runtime dan SOS. |
ehinfo |
Menampilkan blok penanganan pengecualian dalam metode JIT-ed. |
exit atau quit |
Keluar dari mode interaktif. |
finalizequeue |
Menampilkan semua objek yang terdaftar untuk finalisasi. |
findappdomain |
Mencoba mengatasi AppDomain objek GC. |
gchandles |
Menampilkan statistik tentang handel pengumpul sampah dalam prosesnya. |
gcheapstat |
Menampilkan statistik tentang pengumpul sampah. |
gcinfo |
Menampilkan pengodean JIT GC untuk metode . |
gcroot |
Menampilkan info tentang referensi (atau akar) ke objek pada alamat yang ditentukan. |
gcwhere |
Menampilkan lokasi dalam tumpukan GC dari alamat yang ditentukan. |
histclear |
Merilis sumber daya apa pun yang digunakan oleh keluarga perintah Hist. |
histinit |
Menginisialisasi struktur SOS dari log tekanan yang disimpan dalam debuggee. |
histobj |
Memeriksa semua catatan relokasi log tekanan dan menampilkan rantai relokasi pengumpulan sampah yang mungkin menyebabkan alamat yang diteruskan sebagai argumen. |
histobjfind |
Menampilkan semua entri log yang mereferensikan objek pada alamat yang ditentukan. |
histroot |
Menampilkan informasi yang terkait dengan promosi dan relokasi akar yang ditentukan. |
histstats |
Menampilkan statistik log stres. |
ip2md |
Menampilkan MethodDesc struktur pada alamat yang ditentukan dalam kode yang telah dikompilasi JIT. |
listnearobj |
Menampilkan objek sebelumnya dan menggantikan alamat yang ditentukan. |
logopen |
Mengaktifkan pengelogan file konsol. |
logclose |
Menonaktifkan pengelogan file konsol. |
logging |
Mengaktifkan/menonaktifkan pengelogan SOS internal. |
lm atau modules |
Menampilkan modul asli dalam proses. |
name2ee |
MethodTable Menampilkan struktur dan EEClass untuk jenis atau metode yang ditentukan dalam modul yang ditentukan. |
objsize |
Menampilkan ukuran objek yang ditentukan. |
parallelstacks |
Menampilkan tumpukan utas gabungan yang mirip dengan panel Visual Studio 'Parallel Stacks'. |
pathto |
Menampilkan jalur GC dari <root> ke <target> . |
pe atau printexception |
Menampilkan dan memformat bidang dari objek apa pun yang berasal dari kelas Exception pada alamat yang ditentukan. |
r atau registers |
Menampilkan daftar utas. |
runtimes |
Mencantumkan runtime dalam target atau mengubah runtime default. |
setclrpath |
Mengatur jalur untuk memuat file coreclr dac/dbi menggunakan setclrpath <path> . |
setsymbolserver |
Mengaktifkan dukungan server simbol. |
sos |
Menjalankan berbagai perintah debugging coreclr. Gunakan sintaks .sos <command-name> <args> Untuk informasi selengkapnya, lihat 'soshelp'. |
soshelp atau help |
Menampilkan semua perintah yang tersedia. |
soshelp <command> atau help <command> |
Menampilkan perintah yang ditentukan. |
syncblk |
Menampilkan info pemegang SyncBlock. |
taskstate |
Menampilkan status Tugas dalam format yang dapat dibaca manusia. |
threadpool |
Menampilkan info tentang kumpulan utas runtime. |
threadpoolqueue |
Menampilkan item kerja kumpulan utas yang diantrekan. |
threadstate |
Cukup mencetak arti dari status utas. |
threads <threadid> atau setthread <threadid> |
Mengatur atau menampilkan ID utas saat ini untuk perintah SOS. |
timerinfo |
Menampilkan informasi tentang timer yang sedang berjalan. |
token2ee |
Menampilkan struktur MethodTable dan struktur MethodDesc untuk token dan modul yang ditentukan. |
traverseheap |
Menulis informasi tumpukan ke file dalam format yang dipahami oleh CLR Profiler. |
verifyheap |
Memeriksa tumpukan GC untuk tanda-tanda kerusakan. |
verifyobj |
Memeriksa objek yang diteruskan sebagai argumen untuk tanda-tanda kerusakan. |
Catatan
Detail tambahan dapat ditemukan di Ekstensi Debugging SOS untuk .NET.
dotnet-dump ps
Mencantumkan proses dotnet tempat crash dump dapat dikumpulkan.
Versi 6.0.320703 dotnet-dump
dan versi yang lebih baru juga menampilkan argumen baris perintah yang digunakan setiap proses, jika tersedia.
Sinopsis
dotnet-dump ps [-h|--help]
Contoh
Misalkan Anda memulai aplikasi yang berjalan lama menggunakan perintah dotnet run --configuration Release
. Di jendela lain, Anda menjalankan perintah dotnet-dump ps
. Output yang akan Anda lihat adalah sebagai berikut. Argumen baris perintah, jika ada, ditampilkan di versi 6.0.320703 dotnet-dump
dan yang lebih baru.
> dotnet-dump ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
Menggunakan dotnet-dump
Langkah pertama adalah mengumpulkan cadangan. Langkah ini dapat dilewati jika cadangan inti telah dibuat. Sistem operasi atau fitur pembuatan crash dump bawaan runtime .NET Core masing-masing dapat membuat crash dump inti.
$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete
Sekarang analisis crash dump inti dengan perintah analyze
:
$ dotnet-dump analyze ./core_20190226_135850
Loading core dump: ./core_20190226_135850
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
>
Tindakan ini memunculkan sesi interaktif yang menerima perintah seperti:
> clrstack
OS Thread Id: 0x573d (0)
Child SP IP Call Site
00007FFD28B42C58 00007fb22c1a8ed9 [HelperMethodFrame_PROTECTOBJ: 00007ffd28b42c58] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[]) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]
00007FFD28B43210 00007fb22aa9cedf [GCFrame: 00007ffd28b43210]
00007FFD28B43610 00007fb22aa9cedf [GCFrame: 00007ffd28b43610]
Untuk melihat pengecualian yang tidak tertangani yang mematikan aplikasi Anda:
> pe -lines
Exception object: 00007fb18c038590
Exception type: System.Reflection.TargetInvocationException
Message: Exception has been thrown by the target of an invocation.
InnerException: System.Exception, Use !PrintException 00007FB18C038368 to see more.
StackTrace (generated):
SP IP Function
00007FFD28B42DD0 0000000000000000 System.Private.CoreLib.dll!System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Private.CoreLib.dll!System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)+0xa7 [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.dll!SymbolTestApp.Program.Foo2(Int32, System.String)+0x34 [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.dll!SymbolTestApp.Program.Foo1(Int32, System.String)+0x3a [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.dll!SymbolTestApp.Program.Main(System.String[])+0x6e [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]
StackTraceString: <none>
HResult: 80131604
Pemecahan masalah pengumpulan cadangan
Pengumpulan cadangan mengharuskan proses untuk dapat memanggil ptrace
. Jika Anda menghadapi masalah saat mengumpulkan cadangan, lingkungan yang Anda jalankan dapat dikonfigurasi untuk membatasi panggilan tersebut. Lihat Dumps: FAQ kami untuk tips pemecahan masalah dan solusi potensial untuk masalah umum.