Menyediakan Stack Trace

Michael Schwendt, Rahul Sundaram, Ankur Sinha Versi unspecified Last review: 2014

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

  • Mengandung masalah format

  • Ketinggalan zaman

  • Membutuhkan cinta lain

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:

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 SistemAdministrasiTambah/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 AplikasiAlat SistemAlat Pelaporan Bug Otomatis dan pilih opsi tersebut untuk menjalankannya secara manual. Setelah jendela antarmuka pengguna (GUI) muncul, pilih EditPlugins, 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.

Kasus khusus

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 xulrunner sebagai root di baris perintah.

  • Jalankan perintah firefox -g di baris perintah. Hal itu akan memulai Firefox berjalan di dalam debugger GDB.

  • Di gdb, Anda akan melihat prompt gdb (gdb). Ketik perintah run -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 kill -SEGV 1234, di mana 1234 adalah PID dari program yang sedang Anda uji.

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