Bagikan melalui


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:

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.

Lihat juga