Bagaimana cara saya mendekati memperbaiki bug yang tidak dapat diproduksi ulang / muncul secara acak?


11

Kami memiliki situs web multibahasa di mana bug ditemukan beberapa hari yang lalu. Itu menampilkan data bahasa lain dalam bahasa lain dan juga campuran data seperti bahasa Inggris dipilih tetapi itu menampilkan data bahasa lain juga di halaman dan sebaliknya. Ini jarang dilakukan tetapi ada di situs web. Melewati kode juga tidak membantu karena ini tidak selalu terjadi.

Adakah saran dalam menemukan masalah secara tepat waktu? Saya meminta strategi di sini.


4
mulailah menyelidiki kode untuk situasi yang akan memungkinkan bug ini terjadi (alih-alih melakukannya sebaliknya)
Imran Omar Bukhsh

Jawaban:


20

Langkah pertama adalah mencoba dan mengkarakterisasi apa yang dapat menyebabkan masalah jenis ini. Karena ini terkait dengan pemilihan bahasa yang benar untuk bagian kode, mulailah dengan mempertimbangkan yang berikut:

  • Bagaimana bahasa terdeteksi? Apakah ini berdasarkan informasi dari permintaan HTTP? Apakah ini berdasarkan pada informasi sesi ?, atau berdasarkan pada basis data? Intinya, dapatkah ini menjadi masalah terkait bagaimana aplikasi Anda memilih bahasa untuk setiap bagian?
  • Bagaimana bahasa ditampilkan? Apakah Anda menarik dari file properti, atau database? Mungkinkah referensi ke bahasa yang benar hilang beberapa bagaimana? Apakah bahasa campuran yang Anda lihat selalu menjadi standar untuk situs ini?
  • Apakah ada korelasi dengan lingkungan klien? Ini terkait dengan peluru pertama, tetapi bergerak sedikit lebih jauh. Saya punya masalah rendering yang aneh karena proxy caching hilir. Biasanya jenis masalah tersebut adalah seluruh halaman yang basi atau melayani halaman satu orang untuk pengguna lain (yang memalukan).
  • Apakah Anda menggunakan nilai Lokal Thread? Jika permintaan ditangani lebih dari satu utas saya, nilai lokal utas akan memiliki informasi berbeda berdasarkan utas yang berfungsi saat itu. Di lingkungan server web, Anda tidak dapat mengasumsikan bahwa utas yang mulai Anda proses adalah utas yang sama dengan yang Anda selesaikan - kecuali itu adalah bagian dari spesifikasi untuk platform Anda. Penulis server telah menemukan bahwa jika mereka menggunakan kembali kumpulan kecil untaian dan pekerjaan multipleks untuk mereka dalam potongan, mereka dapat menangani lebih banyak permintaan secara bersamaan. Bahkan jika Anda memiliki satu utas dari awal hingga akhir suatu permintaan, server mungkin menggandakan permintaan lain ke utas itu secara bersamaan. Alih-alih utas penduduk setempat, pertimbangkan untuk mengikat nilai itu ke atribut permintaan atau sesi.

Sekarang, setelah Anda ditandai kemungkinan dari apa yang bisa salah, waktu itu untuk memastikan Anda memiliki data yang Anda perlu mencoba dan mencari tahu apa yang lakukan pergi salah.

  • Gunakan penebangan sebanyak-banyaknya di sekitar area masalah. Ini adalah tempat di mana alat seperti Log4J atau Log4Net benar-benar dapat bersinar. Kerangka kerja pencatatan itu, dan yang lainnya menyukainya, memungkinkan Anda untuk mengaktifkan pencatatan untuk kategori-kategori tertentu sambil menekan noise untuk yang lainnya - semua dengan mengubah file konfigurasi. Anda ingin memperkenalkan pernyataan logging baru untuk mencari tahu apakah yang Anda duga mungkin adalah masalahnya. Pastikan juga log akses HTTP Anda memiliki semua informasi yang Anda inginkan tentang setiap permintaan (cookie, parameter header http, dll.)
  • Mencoba mensimulasikan masalah. Karena ini terjadi secara sporadis, seperti apa beban di server pada saat itu terjadi? Apakah Anda mendapatkan sejumlah permintaan simultan dari campuran bahasa? Jika demikian, cobalah mensimulasikan beban semacam itu di lingkungan pengujian Anda. Alat yang mirip dengan JMeter mungkin yang Anda butuhkan. Anda juga ingin bisa memalsukan alamat IP untuk klien palsu Anda. Ingat bahwa alamat IP dibagi keluar sehingga Anda dapat mengetahui negara / wilayah mana IP didasarkan pada dua segmen pertama dari alamat tersebut.
  • Masalahnya akan sama sporadisnya di lingkungan pengujian Anda, tetapi saat Anda mempersempit penyebab sebenarnya, Anda dapat condongkan hasilnya untuk membuatnya lebih sering terjadi daripada di alam liar. Selain itu, Anda dapat lebih mudah meninjau file log dan mencoba belajar darinya.
  • Ini adalah proses berulang, jadi bersabarlah. Anda harus menginduksi jenis beban yang menurut Anda akan mereproduksi bug, memeriksa log, dan memperbaiki tes Anda berdasarkan apa yang Anda temukan. Yang penting adalah mengidentifikasi masalah , jadi tahan dorongan untuk melakukan beberapa perbaikan sederhana yang mungkin hanya membuat masalah yang sebenarnya jarang terjadi.

Akhirnya, setelah Anda mempersempit masalah ke titik di mana Anda tahu bagaimana memperbanyaknya, dan apa yang menyebabkannya, tulis tes otomatis terkecil yang Anda bisa untuk memaksa masalah dalam kode. Jika Anda mempersempit masalahnya menjadi satu kelas, atau sepasang kelas yang tidak bekerja bersama dengan benar, buat ulang di tingkat itu. Anda tidak perlu menelurkan 100 utas untuk melakukannya, cukup lakukan tes terkecil yang dapat menyebabkan masalah terjadi 100% setiap saat.

Sekarang Anda dapat memperbaikinya, dan yakinlah bahwa itu tidak akan kembali menggigit Anda lagi.


10

Bug ini tidak dapat diproduksi ulang. Anda belum menemukan cara memperbanyaknya.

Tidak ada bug yang acak kecuali Anda melempar pengecualian berdasarkan nilai balik dari beberapa pernyataan Random ().

Saya tahu ini mungkin tampak seperti semantik tetapi meyakinkan secara mental untuk mengatakan hal ini kepada diri Anda sendiri.

Sangat sulit dan membuat frustasi untuk mengetahui bagaimana cara memperbaiki bug yang hanya terjadi karena kondisi ras yang kompleks atau semacamnya.

Adapun cara menemukannya, saya akan mengaktifkan / menambahkan beberapa penebangan ke aplikasi di tempat-tempat yang dapat memberi Anda informasi lebih lanjut.

Selanjutnya beri tahu orang-orang yang melihat bug (apakah mereka Devs, QA, pengguna akhir) untuk melaporkan segera setelah mereka melihatnya saat itu terjadi dan kemudian lihat log Anda. Tanyakan kepada mereka untuk informasi lain dan juga bug hanya dapat terjadi karena interaksi dari beberapa sistem yang berbeda atau karena kondisi balapan

Semoga Anda dapat menemukan petunjuk.


bahkan panggilan Acak () tidak benar-benar acak kecuali berasal dari generator white noise perangkat keras. Mereka adalah psuedo-acak, yang berarti angka-angka didistribusikan secara matematis dalam urutan acak mungkin. Tetapi jika Anda mulai dari nilai "seed" yang sama, Anda akan mendapatkan jawaban yang sama setiap saat.
Berin Loritsch

1
@Berin: Saya tahu.
Gilles

+1 untuk "Anda belum menemukan cara mereproduksinya." Semua bug memiliki akar penyebab atau mereka tidak akan terjadi.
Mike S

1
Itu tidak harus dari Acak (), hal-hal yang tergantung waktu, terutama hal-hal yang melibatkan akses yang tidak tepat ke sumber daya bersama bisa sangat sulit untuk mereproduksi.
Loren Pechtel

2
@Gilles: Kecuali mereka mungkin tidak deterministik pada apa pun yang dapat Anda ukur dengan wajar. (Katakanlah, tepat ketika beberapa tugas lain dirilis saatnya potong.)
Loren Pechtel

5

Anda dapat mencoba menemukan tempat di kode Anda di mana Anda dapat mengenali bahwa masalah terjadi (misalnya parameter yang tidak konsisten dalam metode), tambahkan tanda centang ke kode Anda dan biarkan mereka menambahkan informasi tambahan ke log debug (seperti jejak tumpukan, objek ditambahkan ke sesi, dll.)

Melakukan ini dengan sedikit keberuntungan Anda dapat menangkap informasi tentang kejadian dan menyimpulkan jalan Anda kembali ke masalah.


2

Otomasi akan membantu, jika itu adalah langkah yang sama untuk mereproduksi yang terkadang gagal, mengotomatiskannya dan meletakkannya dalam satu lingkaran. Berlari dalam 50.000 kali dan sangat mungkin terjadi.


Acara ini tidak acak, sepertinya acak. Melakukan ini mungkin membuatnya muncul, tetapi akan memberi Anda sedikit informasi tentang mengapa itu muncul.
Josh K

1
@ Josh - Jika dia tidak dapat mereproduksi, ini mungkin cara yang baik untuk melakukan itu dan mendapatkan jejak stack dengan simbol debug, misalnya. Saya pikir itu langkah pertama yang hebat - melihatnya langsung
Kieren Johnstone

Anda mengasumsikan bahwa ada tumpukan dan itu dapat diperoleh. Dia belum memberi kami informasi teknis apa pun tentang aplikasi atau seberapa mudah diaksesnya untuk debugging di bawah jenis beban ini. Ini bukan strategi debugging , ini memukulnya dengan palu yang mencoba menangkap momen yang tepat rusak.
Josh K

@Josh - pengalaman dunia nyata saya memberi tahu saya satu-satunya hal yang paling berharga dalam menginvestigasi / memperbaiki bug adalah melihatnya langsung. Apakah itu sesuatu dengan waktu yang bisa Anda lihat, jejak tumpukan, sesuatu di log, atau apa pun. Jika memungkinkan, memiliki masalah yang tampaknya terjadi secara acak, yang diuji dalam satu lingkaran, telah membawa saya ke sana dengan sangat cepat. Jika Anda memiliki ide yang berbeda, posting sebagai jawaban demi Tuhan - ini adalah metode yang valid dan jawaban yang valid.
Kieren Johnstone

Saya tidak setuju, dan saya percaya jawaban Berin adalah cara yang tepat untuk menyelesaikan masalah ini.
Josh K

1

cobalah untuk menemukan pola untuk dijabarkan kondisi yang menyebabkan masalah ini terwujud. Itu akan mengarahkan Anda ke bagian kode Anda yang gagal (atau berperilaku tidak konsisten).


Tidak sial ..............
theringostarrs

0

Anda dapat mendeteksi ketika masalah ini terjadi? Jika demikian, dapatkah Anda dengan andal membuang informasi tentang keadaan sistem pada saat itu?

Jika jawaban untuk kedua pertanyaan ini adalah ya, masukkan kode Anda untuk mencatat sebanyak mungkin informasi ketika kesalahan sebenarnya terjadi, kemudian tunggu.

Ini bukan pengganti apa yang disarankan orang lain (Anda masih perlu memikirkan bagaimana kode bisa masuk ke keadaan yang Anda lihat), tetapi selama Anda tidak dapat mereproduksi bug sesuka hati, itu ide yang baik untuk tidak menyia-nyiakan kesempatan di mana ia muncul.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.