Bagaimana cara menemukan kode sumber yang menerapkan fitur tertentu? [Tutup]

14

Saya bertanya-tanya apa sajakah teknik untuk menemukan kode mana yang menerapkan fitur spesifik, pada aplikasi desktop.

Saya adalah pengembang junior, dengan hanya pengalaman pemrograman profesional di seputar pemrograman web. Di Web lebih mudah untuk melakukan itu. Misalnya, Anda "memeriksa" tombol dengan alat peramban, dan Anda dapat melihat apa yang sedang dilakukan ketika Anda mengkliknya. Dan kemudian, dengan anggapan Anda memiliki kode sumber lengkap, Anda dapat menelusuri hierarki panggilan.

Tetapi bagaimana Anda melakukan ini di aplikasi desktop? Setidaknya, tanpa harus menyelam ke basis kode lengkap?

py_script
sumber
6
Alih-alih membaca kode, kadang-kadang Anda dapat menggunakan debugger. Cara kerjanya (dan seberapa ramah pengguna bagi Anda) tergantung pada bahasa, debugger, dan antarmuka debugger yang digunakan. Bagaimanapun, menggunakan debugger adalah seni yang harus dipelajari - tetapi setelah dipelajari itu adalah alat yang sangat kuat. Saya harus belajar menggunakannya sendiri.
amon
Dan di mana saya harus mengatur breakpoint?
py_script
Pengaturan breakpoint sepenuhnya tergantung pada aplikasi Anda dan bagaimana pengaturannya .
2
Sebenarnya bisa agak sulit untuk "memeriksa" dan melihat di mana dan bagaimana antarmuka web dibuat, dengan sistem berorientasi objek baru seperti Backbone.js dan templat, yang menjadi lebih populer.
NoBugs
1
@jeffo Ketika Anda melakukannya, misalnya, File-> Buka dalam aplikasi (katakanlah LibreOffice's Writer) bagaimana Anda bisa menemukan urutan panggilan apa di balik itu?
py_script

Jawaban:

21

Tracing kembali

Back tracing adalah menemukan titik akhir ke peristiwa yang terkait dengan fitur (lihat di bawah). Sesampai di sana, breakpoint ditempatkan di debugger. Fitur ini dipicu dan ketika debugger berhenti. Tumpukan panggilan ditinjau untuk melacak jejak jalur panggilan. Saat berjalan menumpuk tumpukan panggilan Anda dapat membuat catatan pada negara variabel, atau menempatkan breakpoints baru untuk memeriksa acara lagi.

Fitur ini terpicu lagi dan debugger berhenti di breakpoints baru. Anda kemudian dapat mengulangi pelacakan kembali atau melakukan pelacakan maju sampai tujuan ditemukan.

Pro kontra

  • Itu selalu lebih mudah untuk berjalan tumpukan panggilan dan melihat bagaimana Anda sampai di suatu tempat.
  • Mungkin ada jutaan kondisi yang perlu benar sebelum mencapai titik akhir. Jika Anda tahu titik akhirnya Anda telah menghemat banyak pekerjaan.
  • Jika fitur ini rusak. Anda mungkin tidak pernah mencapai titik akhir, dan waktu bisa terbuang sia-sia untuk mencari tahu mengapa.

Penemuan Titik Akhir

Untuk men-debug fitur Anda harus tahu di mana dalam kode sumber tujuan akhir tercapai. Hanya dari titik ini Anda dapat melacak kembali untuk melihat bagaimana kode sampai di sana. Sebuah contoh; Untuk memahami bagaimana membatalkan dilakukan. Anda tahu di mana dalam kode semuanya dibatalkan, tetapi Anda tidak tahu bagaimana hal-hal itu sampai di sana . Ini akan menjadi kandidat untuk penelusuran balik untuk mengetahui cara kerja fitur.

Tracing Maju

Tracing ke depan adalah menemukan titik awal untuk peristiwa yang terkait dengan fitur (lihat di bawah). Sesampai di sana, pesan logging dimasukkan ke dalam kode sumber atau breakpoints diatur. Proses ini diulangi saat Anda berkembang lebih jauh dari titik awal hingga Anda menemukan tujuan untuk fitur tersebut.

Pro kontra

  • Ini adalah titik awal termudah untuk menemukan fitur.
  • Kompleksitas kode mengurangi efektivitas pelacakan maju. Semakin banyak kondisi dalam kode, semakin besar peluang Anda untuk pergi ke arah yang salah.
  • Forward tracing seringkali menghasilkan pengaturan breakpoint yang akan dipicu oleh peristiwa yang tidak terkait. Mengganggu proses debugging dan mengganggu pencarian Anda.

Mulai Point Discovery

Anda dapat menggunakan kata kunci, pengidentifikasi antarmuka pengguna (ID tombol, nama jendela) atau mudah menemukan pendengar acara yang terkait dengan fitur tersebut. Misalnya, Anda dapat memulai dengan tombol yang digunakan untuk memicu fitur undo .

Proses Eliminasi

Anda dapat menganggap ini sebagai titik tengah dibandingkan dengan posisi titik awal dan titik akhir . Anda melakukan proses eliminasi ketika Anda sudah tahu sepotong kode digunakan dalam suatu fitur, tetapi itu bukan awal atau akhir dari fitur.

Arah yang Anda ambil dari titik tengah tergantung pada jumlah entri dan keluar. Jika potongan kode digunakan di banyak tempat, maka melacak kembali dari posisi ini bisa sangat memakan waktu karena mereka semua harus diperiksa. Anda kemudian menggunakan proses eliminasi untuk mengurangi daftar ini. Alternatif, Anda dapat melakukan jejak maju dari titik ini, tetapi sekali lagi jika kode memotong cabang ke banyak tempat ini juga bisa menjadi masalah.

Anda harus mengurangi arah posisi dengan tidak mengikuti jalur yang jelas tidak akan dieksekusi untuk fitur ini. Bergerak melewati kode ini dan hanya menempatkan breakpoint di mana kemungkinan terkait dengan fitur.

Debugging titik tengah sering membutuhkan fitur IDE lebih lanjut. Kemampuan untuk melihat hierarki kode dan dependensi. Tanpa alat-alat itu sulit dilakukan.

Pro kontra

  • Poin tengah seringkali merupakan bagian pertama dari kode yang muncul di kepala Anda ketika Anda memikirkan fitur tersebut. Anda berkata pada diri sendiri, "Ah, itu harus menggunakan XXXX agar berfungsi."
  • Poin tengah dapat mengungkapkan titik awal yang paling mudah.
  • Poin tengah bisa menjadi cara mudah untuk mengambil jejak ke fitur saat hilang oleh sinkronisasi atau perubahan threading.
  • Poin tengah dapat membawa Anda ke kode yang tidak Anda kenal. Menghabiskan waktu untuk mempelajari apa yang sedang terjadi.
Reactgular
sumber
Terima kasih Matthew, pendekatan yang bagus. Tetapi bagaimana Anda menemukan titik awal (maaf jika sudah jelas bagi semua kecuali saya)?
py_script
@py_script Bahasa pemrograman apa yang Anda hadapi?
Reactgular
Ini bukan tentang masalah khusus yang saya miliki, tetapi bahasa pemrograman Desktop utama saya adalah Java, jadi mari kita lanjutkan
py_script
11

Dengan asumsi bahwa fitur ini terkait dengan beberapa UI UI, seperti Button atau Menu, apa yang saya cenderung lakukan berikut (sangat membosankan tetapi berfungsi). Ini mencari melalui Kode Sumber, tidak menggunakan debugger .

  1. Cari teks (semoga berbeda) pada tombol, mis. "Fitur Super X3".
  2. Itu mungkin dalam file dengan beberapa konstanta, mis SUPER_BUTTON_3 = "Super Feature X3". Untuk referensi di masa mendatang, ingat nama file ini.
  3. Mungkin ada lapisan lain (bahkan dua) abstraksi, terus mencari untuk mendapatkan "nyata" String yang digunakan oleh Tombol. Perhatikan bagaimana ini dilakukan untuk masa depan.
  4. Sekarang cari di konstanta itu. Semoga Anda sekarang telah menemukan Tombol. Mungkin di situlah mereka menghubungkan ActionListener. (Saya membawa Java-ese di sini, YMMV, tetapi konsepnya masih berlaku)
  5. Jika perlu, cari pada Tombol itu dan pada akhirnya Anda akan menemukan di mana ia terhubung ke Pendengar.
  6. Mungkin pendengar itu benar-benar mengarahkan ulang ke pendengar lain (fungsi "nyata") berdasarkan konstanta, jika demikian, ikuti itu jika / lain atau pernyataan kasus. CATATAN : Jika ada hal pengiriman pusat, ini adalah tempat yang bagus untuk menyiapkan breakpoints .
  7. Akhirnya, Anda harus berada pada kode aktual.

Seperti yang dicatat @amon, terkadang Debugger lebih sederhana ...

pengguna949300
sumber
Yang menarik ... untungnya nama-nama seperti itu biasanya hardcoded dalam kode :)
py_script
3
  • Jika Anda dapat menemukan kode terkait sama sekali, Anda dapat menggunakan perangkat lunak kontrol sumber Anda untuk menunjukkan kepada Anda seluruh komit atau komit terdekat yang menambahkannya. Itu akan menunjukkan kepada Anda segala yang diperlukan untuk mengimplementasikan fitur itu.

  • Salah satu cara mudah untuk menemukan beberapa titik awal untuk dilihat adalah dengan memeriksa basis kode Anda mencari teks pada tombol.

  • Seringkali, orang-orang akan memasukkan id masalah dari pelacak masalah mereka dalam pesan komit mereka. Jika Anda dapat menemukan masalah yang menggambarkan permintaan fitur, maka Anda dapat mencari komit dengan id masalah itu.

Michael Burge
sumber
Itu pendekatan yang cerdas tetapi saya pikir itu hanya bekerja pada lingkungan perusahaan. Bagaimana jika Anda hanya memiliki tarball?
py_script