Menyediakan Stack Trace
|
Halaman ini diambil dari dokumentasi Fedora Wiki sebelumnya. Dokumen ini telah disunting untuk dipublikasikan di Portal Dokumen Fedora, tetapi belum direview untuk keakuratan teknisnya. Mungkin saja
Ulasan mengenai akurasi teknis sangat dihargai. Jika Anda ingin membantu, lihat berkas README di repositori sumber untuk petunjuk. Permintaan pull diterima di https://pagure.io/fedora-docs/quick-docs Setelah Anda memperbaiki halaman ini, hapus pemberitahuan ini. |
Stack trace adalah salah satu informasi paling penting yang dapat Anda berikan untuk membantu orang lain mendebug kegagalan aplikasi. Halaman ini menjelaskan pentingnya stack trace dan merinci beberapa metode untuk mendapatkan stack trace.
Jika Anda mengalami crash, langkah-langkah dasar untuk menghasilkan stack trace yang berguna untuk aplikasi desktop Gnome yang umum adalah:
-
Instal paket RPM -debuginfo yang sesuai sebelum terjadinya crash (lihat bagian "Apa itu debuginfo RPM, dan bagaimana cara mendapatkannya?" di bawah ini).
-
Tunggu hingga crash terjadi atau lakukan langkah-langkah yang dapat mereproduksi masalah tersebut.
-
ABRT (Alat Pelaporan Bug Otomatis) di Fedora akan secara otomatis mendeteksi crash dan memperoleh stack trace.
-
Sertakan stack trace dalam laporan bug Anda (lihat dokumen "Cara Mengajukan Laporan Bug" untuk petunjuk lengkap).
Jika ABRT tidak dimulai secara otomatis, Anda perlu memulai program tersebut dengan cara khusus, menggunakan debugger (seperti gdb). Lihat bagian Mendapatkan stack trace menggunakan hanya GDB di bawah ini.
Petunjuk khusus berlaku untuk program Java dan Firefox.
Apa itu stack trace (backtrace)?
Stack trace (kadang-kadang juga disebut backtrace) adalah daftar panggilan fungsi yang mengarah ke suatu titik dalam program. Alat debugging seperti gdb atau bug-buddy dapat mengambil stack trace dari aplikasi yang mengalami crash sehingga pengembang dapat mengetahui apa yang salah.
Bagaimana tampilan stack trace?
Sebuah stack trace tipikal terlihat mirip dengan berikut ini:
[New Thread 8192 (LWP 15167)]
0x420ae169 in wait4 () from /lib/i686/libc.so.6
.
.
.
Sebuah backtrace yang lebih baik, dengan simbol debuginfo (lihat di bawah), terlihat seperti ini:
0x000000350a6c577f in *__GI___poll (fds=0xe27460, nfds=9, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:83
83 return INLINE_SYSCALL (poll, 3, CHECK_N (fds, nfds), nfds, timeout);
.
.
.
Perhatikan nama file dan nomor baris di mana fungsi-fungsi tersebut dipanggil.
Apa itu simbol debugging, dan mengapa mereka penting?
Ketika sebuah program dikompilasi dengan opsi khusus untuk menghasilkan simbol debugging (opsi kompiler -g), informasi tambahan disimpan dalam berkas program. Informasi ini dapat digunakan untuk menghasilkan jejak tumpukan (stack trace) yang mengandung informasi yang jauh lebih detail, seperti nomor baris tepat pada berkas sumber di mana kesalahan terjadi. Tanpa informasi ini, sangat sulit untuk menentukan apa yang salah dengan melihat jejak tumpukan.
Apa itu debuginfo RPM, dan bagaimana cara mendapatkannya?
Fedora menyertakan jenis khusus RPM yang disebut debuginfo RPM. RPM ini dibuat secara otomatis dan berisi informasi debugging dari berkas program, namun dipindahkan ke berkas eksternal. Semua alat yang menangani informasi debugging tahu cara secara otomatis mencari berkas-berkas ini. Hal ini memungkinkan Anda dengan mudah menginstal informasi debugging saat Anda membutuhkannya. Anda harus menginstal versi dan arsitektur debuginfo yang persis sama dengan aplikasi yang ingin Anda debug.
Contoh: Memverifikasi Versi dan Arsitektur yang Sesuai
[warren@computer ~] $ rpm -q --qf '%{name}-%{version}-%{release}.%{arch}\n' gaim gaim-debuginfo
gaim-2.0.0-0.26.beta5.i386
gaim-debuginfo-2.0.0-0.26.beta5.i386
Setiap paket yang berisi file biner dalam distribusi memiliki paket debuginfo yang sesuai.
Menginstal paket debuginfo RPM menggunakan DNF
debuginfo-install adalah plugin yang berguna, bagian dari paket dnf-plugins-core, yang secara otomatis mengaktifkan repositori debuginfo dan mengunduh semua paket debuginfo yang diperlukan. Anda dapat melakukan:
$ dnf debuginfo-install <pkg-spec>
untuk menginstal semua paket debuginfo yang diperlukan untuk paket <pkg-spec>.
Untuk menginstal hanya paket debuginfo minimal, gunakan daftar paket perintah (tanpa benar-benar menginstal apa pun) untuk mendapatkan nama paket debuginfo dan repositori masing-masing. Kemudian buat perintah instalasi sesuai dengan contoh berikut:
$ dnf --enablerepo=fedora-debuginfo --enablerepo=updates-debuginfo install <pkg-spec>-debuginfo
Hal ini berguna ketika Anda tidak ingin menginstal debuginfo untuk semua dependensi paket yang sedang didebug, karena debuginfo untuk dependensi tersebut seringkali tidak diperlukan.
Menginstal paket debuginfo RPM menggunakan yum
debuginfo-install adalah utilitas yang berguna, bagian dari paket yum-utils, yang secara otomatis mengaktifkan repositori debuginfo dan mengunduh semua paket debuginfo yang diperlukan. Anda dapat melakukan:
$ debuginfo-install foo
untuk menginstal semua paket debuginfo yang diperlukan untuk paket foo.
Untuk menginstal hanya paket debuginfo minimal, gunakan output dari debuginfo-install (tanpa benar-benar menginstal apa pun) untuk mendapatkan nama paket debuginfo dan repositori masing-masing. Kemudian buat perintah instalasi sesuai dengan contoh berikut:
$ yum --enablerepo fedora-debuginfo,updates-debuginfo install foo-debuginfo
Hal ini berguna ketika Anda tidak ingin menginstal debuginfo untuk semua dependensi paket yang sedang didebug, karena debuginfo untuk dependensi tersebut seringkali tidak diperlukan.
Menginstal paket RPM debuginfo secara manual
Paket-paket ini dapat diunduh dari cermin Fedora normal di direktori "debug" dalam direktori arsitektur. Misalnya, paket debuginfo untuk versi pengembangan terbaru tersedia di http://mirrors.fedoraproject.org/publiclist/Fedora/development/ . Silakan gunakan cermin yang paling dekat dengan lokasi Anda saat mengunduh.
Pengemas (Packager)
Jika Anda adalah seorang pengemas yang mencari informasi tentang paket RPM debuginfo, lihat dokumen Paket Debuginfo.
Bagaimana cara menghasilkan backtrace?
Pertama, pastikan Anda telah menginstal paket debuginfo untuk aplikasi yang sedang Anda debug dan semua perpustakaan terkait. Seorang pengembang sering menyarankan Anda untuk menginstal paket debuginfo tertentu karena ia dapat mengetahui dari jejak tumpukan (stack trace) perpustakaan mana yang terlibat dalam kegagalan (crash). Lihat di bawah ini untuk paket yang direkomendasikan untuk beberapa jenis aplikasi umum.
Ada beberapa cara untuk mendapatkan stack trace:
-
Mendapatkan stack trace menggunakan Mendapatkan stack trace menggunakan hanya GDB.
-
Mendapatkan stack trace dari core dump dengan GDB.
-
Mendapatkan stack trace dari aplikasi menggunakan Alat Pelaporan Bug Otomatis.
Paket debuginfo apa yang harus saya instal?
Setidaknya, Anda perlu menginstal paket debuginfo untuk aplikasi yang mengalami crash. Anda dapat mengetahui paket mana yang berisi aplikasi tersebut dengan mengetikkan rpm -qf path-of-program.
Untuk jenis program tertentu, sangat berguna untuk menginstal beberapa paket default yang berguna untuk hampir semua stack trace:
-
Aplikasi Gnome dan aplikasi yang menggunakan Gtk+:
glib2-debuginfo, pango-debuginfo, gtk2-debuginfo -
Aplikasi KDE:
qt-debuginfo, kdelibs-debuginfo
Mendapatkan stack trace menggunakan hanya GDB
|
Jika Anda menjalankan program Java seperti Eclipse atau Tomcat, situasinya sedikit lebih rumit - lihat Program Java untuk detailnya. |
Pertama, jalankan perintah berikut untuk memulai gdb:
gdb name-of-program
Di mana nama-program adalah nama program yang mengalami crash (misalnya: /usr/bin/gnome-panel).
Kemudian, di prompt gdb, ketik:
jalan
Jika Anda perlu memberikan argumen kepada program, berikan argumen tersebut setelah perintah run, seperti:
run --argument
Setelah program berjalan, ulangi kesalahan tersebut dan kembali ke terminal tempat Anda menjalankan gdb. Prompt gdb seharusnya ditampilkan - jika tidak, tekan Control+C untuk masuk ke debugger. Di prompt debugger gdb, ketik:
benang terapkan semua BT penuh
Jika cara tersebut tidak berhasil (artinya Anda tidak mendapatkan output apa pun—hal ini mungkin terjadi pada program yang tidak menggunakan multi-threading), ketik <code>bt</code> sebagai gantinya. Jika Anda masih tidak mendapatkan output apa pun, baca [[#special| catatan ini]] tentang cara mendapatkan stack trace dalam kondisi khusus. Output yang ditampilkan adalah stack trace. Salin dan tempel seluruhnya ke dalam berkas teks.
Anda dapat keluar dari gdb dengan mengetikkan quit.
Terkadang, jejak (trace) bisa cukup besar dan sulit untuk disalin dan ditempelkan. Dalam situasi seperti itu, menyimpan jejak ke dalam berkas (file) sangat praktis:
gdb
> run
# program crashes
> set logging file backtrace.log
> set logging on
> thread apply all bt full
> set logging off
> quit
Mendapatkan stack trace dari core dump
Jika program yang mengalami crash meninggalkan file core dump, Anda dapat menggunakan GDB untuk mendapatkan stack trace. File core dump disimpan dalam file di hard disk Anda dan biasanya diberi nama seperti "core" atau "core.3124". Untuk mendapatkan stack trace dari salah satu file tersebut, jalankan perintah berikut:
gdb name-of-program core-file-name
Di mana name-of-program adalah nama program yang mengalami crash (misalnya: /usr/bin/gnome-panel), dan core-file-name adalah nama file core yang berisi dump core (misalnya: core.7812).
Kemudian, di prompt gdb, ketik:
benang terapkan semua BT penuh
Jika cara tersebut tidak berhasil (artinya Anda tidak mendapatkan output apa pun—hal ini mungkin terjadi pada program yang tidak mendukung multi-threading), ketik bt sebagai gantinya. Jika Anda masih tidak mendapatkan output apa pun, baca catatan ini tentang cara mendapatkan stack trace dalam kondisi khusus. Output yang ditampilkan adalah stack trace. Salin dan tempel seluruhnya ke dalam berkas teks.
Anda dapat keluar dari gdb dengan mengetikkan quit.
Perhatikan bahwa pembuatan file inti dinonaktifkan secara default di Fedora (di /etc/profile). Untuk mengaktifkannya untuk sesi shell, ketik di prompt shell:
ulimit -c unlimited
Cara menginstal ABRT
Jika Anda menginstal Fedora melalui image LiveCD, ABRT seharusnya sudah terinstal. Anda dapat memulainya melalui Aplikasi → Alat Sistem → Alat Pelaporan Bug Otomatis. Jika ABRT tidak terinstal, karena alasan apa pun, Anda dapat menginstalnya secara manual dengan melakukan langkah-langkah berikut di baris perintah:
$ su -c 'dnf install abrt'
atau buka Sistem → Administrasi → Tambah/Hapus Perangkat Lunak di Gnome, lalu ketik abrt di kotak pencarian dan pilih Temukan. Pilih paket abrt dan terapkan perubahan.
Konfigurasi ABRT untuk Bugzilla
Buka Aplikasi → Alat Sistem → Alat Pelaporan Bug Otomatis dan pilih opsi tersebut untuk menjalankannya secara manual. Setelah jendela antarmuka pengguna (GUI) muncul, pilih Edit → Plugins, lalu dari jendela Pengaturan, gulir ke bawah, sorot Bugzilla, dan pilih Konfigurasi Plugin. URL Bugzilla harus https://bugzilla.redhat.com dan masukkan nama pengguna dan kata sandi Bugzilla Anda di kotak yang sesuai.
|
Jika Anda belum memiliki akun Bugzilla, sekarang adalah saat yang tepat untuk membuatnya. Kunjungi URL yang tertera di halaman tersebut dan buat akun baru. |
Selanjutnya, jika program Anda mengalami crash dan ABRT terpicu, saat Anda mengklik "Laporkan", ABRT akan dapat secara otomatis masuk ke Bugzilla dan mengirimkan Laporan Bug untuk Anda.
Menggunakan ABRT
(Berikut ini mengasumsikan Gnome sebagai lingkungan desktop … orang lain harus memperbarui untuk KDE/lainnya)
Jika ABRT mendeteksi program yang mengalami crash, Anda akan menerima peringatan ABRT. Peringatan ini akan ditandai secara visual dengan lampu merah berkedip di area sistem tray. Klik kiri pada lampu peringatan, dan Alat Pelaporan Bug Otomatis (ABRT) akan dimulai, menampilkan semua crash yang telah terdaftar. Untuk melaporkan bug, klik kanan pada bug tersebut dan pilih “Laporkan”. ABRT akan mengumpulkan log yang diperlukan untuk dilaporkan bersama bug, lalu akan memberi tahu Anda bahwa ia akan mengirimkan laporan bug atas nama Anda. Jika Anda telah mengonfigurasi ABRT seperti pada bagian sebelumnya, ABRT akan meminta Anda untuk memverifikasi apakah akan menyertakan berbagai log, lalu secara otomatis akan terhubung ke Bugzilla dan membuka bug, menyertakan log ke dalam bug tersebut. ABRT kemudian akan menampilkan nomor bug sehingga Anda dapat melacak bug tersebut saat ditangani.
Konfigurasi ABRT saat Debuginfos tidak tersedia
Ketika Anda mengklik kanan pada sebuah bug di ABRT dan memilih Laporkan, ABRT akan mencoba mengunduh log yang diperlukan untuk dikirim sebagai bagian dari laporan bug. Pengembang telah menambahkan kode untuk mendeteksi apakah jejak simbolik termasuk dalam backtrace, dan jika tidak ditemukan, ABRT akan memberi tahu Anda tentang hal ini, serta menampilkan perintah yang perlu dijalankan. Ini sama dengan yang ditampilkan di bagian debuginfo.
Program yang berjalan sebagai pengguna lain
Jika Anda tidak mendapatkan output apa pun dari gdb setelah mengetik thread apply all bt atau bt, hal ini mungkin disebabkan karena program dijalankan sebagai root atau sebagai pengguna lain. Misalnya, dalam GNOME, hal ini terjadi saat menjalankan gnome-games. Dalam kasus seperti ini, Anda perlu menjadi root untuk menangkap jejak. Oleh karena itu, keluar dari gdb, masuk sebagai root, lalu ulangi langkah-langkah tersebut untuk mendapatkan stack trace.
Firefox
-
Instal paket informasi debug Firefox dan Xulrunner - jalankan perintah
ebuginfo-install firefox xulrunnersebagai root di baris perintah. -
Jalankan perintah
firefox -gdi baris perintah. Hal itu akan memulai Firefox berjalan di dalam debugger GDB. -
Di gdb, Anda akan melihat prompt gdb
(gdb). Ketik perintahrun -safe-mode. Jendela dialog akan muncul, nonaktifkan semua add-on di sini dan lanjutkan dalam mode aman. -
Lakukan apa pun yang diperlukan untuk membuat Firefox crash, lalu ikuti petunjuk di atas untuk penggunaan GDB.
-
Ketika Firefox mengalami crash, dapatkan backtrace dan lampirkan ke Bugzilla.
Untuk informasi tambahan, lihat Panduan debugging untuk produk Mozilla.
Thunderbird
Hampir sama dengan Firefox, hanya saja paket informasi debug-nya berbeda. Pasang paket tersebut dengan perintah "debuginfo-install thunderbird" sebagai root di konsol.
Untuk informasi tambahan, lihat Panduan debugging untuk produk Mozilla.
Program Java
Lihat dokumen Troubleshooting Java Programs untuk informasi tentang cara mendapatkan stack trace dari program yang berjalan di Java.
Daemon dan keturunannya
Anda perlu mengumpulkan backtrace dari berkas inti.
Pastikan skrip inisialisasi daemon Anda tidak melarang penulisan berkas core ke disk. Tambahkan baris DAEMON_COREFILE_LIMIT=unlimited ke berkas konfigurasinya di /etc/sysconfig. Misalnya, daemon Bluetooth (hcid) menggunakan /etc/sysconfig/bluetooth.
Kemudian atur kernel agar dump inti ditulis ke lokasi yang diketahui, seperti /tmp. Sebagai root, jalankan:
echo /tmp/core > /proc/sys/kernel/core_pattern
Untuk membuat perubahan ini permanen, tambahkan baris tersebut ke /etc/sysctl.conf:
kernel.core_pattern = /tmp/core
Dan jalankan perintah sysctl -p untuk menerapkan pengaturan tersebut secara langsung.
Daftar lengkap pola yang mungkin untuk berkas inti tersedia di sysctl/kernel.txt kernel Documentation.
Akhirnya, setelah berhasil mereproduksi masalah Anda, Anda dapat memeriksa kembali file core mana yang dihasilkan dengan perintah file /tmp/core.1234. Kemudian jalankan gdb pada file tersebut untuk membuat jejak tumpukan pasca-kegagalan:
gdb /path/to/binary/file /tmp/core.1234
dan ikuti petunjuk di atas untuk penggunaan gdb.
|
Anda dapat menguji apakah pencadangan berkas inti (core file) akan berhasil dengan menjalankan perintah |
Alat lain
Valgrind
Alat yang sangat berguna, valgrind, sering kali dapat memberikan informasi lebih detail tentang apa yang salah; ia dapat menampilkan jejak memori (stack trace) hingga titik di mana masalah mulai terjadi, yang mungkin terjadi jauh sebelum program sebenarnya crash. Program yang dijalankan melalui Valgrind akan berjalan sekitar sepuluh kali lebih lambat dan menggunakan lebih banyak memori, tetapi tetap akan sangat berguna.
Setelah Valgrind diinstal (dnf install valgrind), Anda dapat menggunakannya pada program:
valgrind name-of-program program-arguments
Dengan debuginfo terpasang, stacktrace akan menggunakan nama simbolik. Lihat [http://valgrind.org/ valgrind.org] untuk informasi lebih lanjut dan tips dan trik.
strace
strace dapat melacak semua panggilan sistem yang dilakukan oleh suatu program, yang juga dapat membantu dalam proses debugging, meskipun tidak dapat menghasilkan jejak tumpukan. Instal dengan perintah dnf install strace, dan lihat man strace untuk detailnya.
Situasinya sedikit membaik. Fitur stack trace kini telah diimplementasikan (strace -k). Namun, fitur ini dinonaktifkan saat proses kompilasi karena implementasinya belum stabil pada arsitektur i386.
Referensi
-
Sebagian besar teks dari halaman ini diambil dari GNOME bugsquad tentang cara mendapatkan stack trace.
Want to help? Learn how to contribute to Fedora Docs ›