http - 如何通过 debugging 来学习软件的运行原理?
伊谢尔伦
伊谢尔伦 2017-04-22 08:59:18
0
2
660

第一次在 SegmentFault 提问,请多关照 ^^

这个问题可能有点泛泛,请先让我具体描述一下。我是一个编程小白初学者(本职是设计,编程是好奇心作祟),不过我也系统学习了 HTTP 以及一些基本的编程技术,最近经人介绍学起了 Rails 才逐渐了解和学习到编程方方面面的知识,很喜欢,刚刚跟着一个教程编写了一个非常简单的注册/登录功能,目前工作良好。

然而我的导师(带我入门的朋友)跟我说:

在 Web 开发中,身份校验是非常典型的功能,所有的 Web 开发框架都会提供哪怕是最基本的支持,同样也有很多第三方的插件和扩展包来提供更丰富的接口和功能。尝试学习和了解经典的身份校验原理对于 Web 开发者来说简直就是必修课。比如你刚才实现的东西,行话说就是:'基于 cookie 的认证机制'。你觉得不难,那是因为 Rails 帮你做了很多很多事情,而你做的只是最表层的,也是最简单的一些必要步骤而已。有机会的话,不妨试试去跟踪登录时框架的全过程,对你大有裨益的。

以上是他的原话(略作整理),我听了以后第一感觉好像很有道理……于是我问他怎么跟踪这个过程,但由于我们通讯不便(在外地旅游),他只给我讲了一些很抽象很难懂的要点。他建议我上这里来问问各路英雄,遇见类似的问题(不限定于注册/登录,也不限定于 Rails/Ruby),如果你们需要跟踪源代码来学习和理解某一个具体的功能实现,一般会怎么做?有什么要注意的事项或技巧呢?

其实我自己知道是要用到 debugging 的技术的,一些基本的技术我之前也学习过,至少知道如何给自己写的代码打断点,然后查看运行时的变量值或者步进/跳转之类的。但是就上述问题来说,当我登录的时候,我并不知道(举例) Rails 框架何时何地向我的浏览器发送 cookie 等等,在这种情形下,面对庞大的框架(随便看看就头晕)我要如何找到下手的地方呢?

真心请教各位学长前辈们,希望能从你们身上获得宝贵的启发和经验,谢谢!

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

membalas semua(2)
阿神

Pendapat peribadi, untuk rujukan sahaja.
Menggunakan penyahpepijatan dan kod adalah cara yang baik untuk mempelajari rangka kerja, tetapi premisnya ialah anda memahami pengetahuan asas Jika anda tidak biasa dengan protokol http itu sendiri, maka melihat rangka kerja yang melaksanakan ini adalah seperti membaca bible.

Contohnya, pengesahan identiti ini.
Pertama sekali, anda perlu tahu bahawa http dalam kebanyakan kes adalah sambungan pendek Pelanggan (pelayar dalam kebanyakan kes) mewujudkan sambungan dengan pelayan http, menghantar data, dan kemudian mendapatkan data yang dikembalikan oleh pelayan, dan kemudiannya. sambungan terputus.
Kedua, anda perlu tahu bahawa data dalam komunikasi http dibahagikan kepada permintaan (Permintaan) dan respons (Respons) Permintaan dihantar oleh klien (kepada pelayan), dan respons dikembalikan oleh pelayan kepada klien. Permintaan dan respons dibahagikan kepada Header dan Response Content (Kandungan), header diperlukan, dan kandungan boleh kosong.

Setelah mengetahui dua perkara di atas, mari lihat pengesahan identiti.

Pengesahan identiti secara kasar dibahagikan kepada dua proses:
1. Log masuk pengguna; 2. Apabila pengguna mengakses sumber lain, anda memperoleh identiti pengguna dan menentukan sama ada dia boleh mengakses sumber ini;
Seperti yang dinyatakan di atas, http ialah sambungan pendek dalam kebanyakan kes, dan senario di atas ialah sambungan pendek.
Pengguna log masuk dan mengakses sumber lain, yang jelas merupakan dua sambungan.

Kemudian pelayan tidak dapat menentukan bahawa kedua-dua sambungan adalah daripada anda, jadi bagaimana anda mendapatkan identiti pengguna apabila anda menyambung ke sumber untuk kali kedua?

Untuk menyelesaikan masalah ini, protokol http menetapkan kuki.

Semasa sambungan pertama - semasa memproses log masuk pengguna, jika pengguna berjaya log masuk, pengepala respons pelayan (Respons) mengandungi pengepala Set-Cookie, yang mengandungi maklumat pengguna, yang menunjukkan bahawa klien menyimpan beberapa kuki dan menetapkan dalam keadaan apa (lihat peruntukan kuki untuk butiran) pelanggan harus menghantar semula kuki ini kepada pelanggan.
Semasa sambungan kedua - apabila mengakses sumber, kerana syarat untuk menghantar kuki dipenuhi, pelanggan akan meletakkan kuki dalam pengepala permintaan (Permintaan) sebagai pengepala Kuki. Dengan cara ini, pelayan mendapat kuki dengan menghuraikan pengepala permintaan, dan juga mendapatkan maklumat pengguna daripadanya.

Ini ialah proses pelaksanaan asas pengesahan identiti.

Antaranya, penyemak imbas mengendalikan Set-Cookie dalam pengepala respons, menyimpan kuki dan meletakkan kuki dalam pengepala permintaan dan menghantarnya ke pelayan apabila syarat dipenuhi.

Meletakkan Set-Cookie dalam pengepala respons dan membaca maklumat Kuki daripada pengepala permintaan boleh dilaksanakan oleh rangka kerja yang anda gunakan.

////////// Tambahkan balasan pada jawapan //////////
Selepas penyoal menjawab, saya menambah isi yang dibincangkan dengan penyoal ke dalam jawapan.
Apa yang saya nyatakan di atas adalah prasyarat untuk memahami rangka kerja. Maksudnya, anda mesti terlebih dahulu memahami perkara yang telah dilakukan oleh rangka kerja untuk anda, dan kemudian melihat bagaimana rangka kerja melakukan perkara ini.
Berikut adalah kandungan perbincangan, saya malas dan menyalin dan menampalnya terus:
Biar saya bercakap tentang pemahaman umum saya: rangka kerja Web bertanggungjawab untuk penyahkodan permintaan dan pengekodan dan pengkapsulan respons. Apabila pembangun perlu menulis logik, mereka hanya perlu mendapatkan parameter dan mengembalikan data. Cara parameter diambil daripada permintaan dan cara hasil yang dikembalikan dikodkan ke dalam respons semuanya dilakukan oleh rangka kerja.
Oleh itu, secara amnya, anda boleh menetapkan titik putus pada permulaan dan penghujung logik yang anda tulis, dan kemudian ikuti pemprosesan di dalam rangka kerja.
Mula-mula, tetapkan titik putus pada penghujung Ini agak mudah, kerana selepas pemprosesan logik anda selesai dan data dikembalikan, ia diserahkan kepada rangka kerja pada masa ini, anda boleh mengikuti bahagian dalam kod rangka kerja melalui penjejakan satu langkah dan lihat kembali anda langkah demi langkah Data diproses oleh rangka kerja.
Yang lain adalah untuk menetapkan titik putus pada permulaan Pada masa ini, bahagian pemprosesan rangka kerja sebenarnya telah dilaksanakan, tetapi alat penyahpepijatan umum boleh melihat timbunan panggilan untuk melihat kod rangka kerja yang dilaksanakan sebelum ini melaksanakan kod logik anda Kemudian cari kod di mana permintaan baru tiba, tetapkan titik putus di sini, hantar permintaan itu semula, dan kemudian ikuti langkah demi langkah.
Selepas mengikuti kod permulaan dan penamat, anda akan memahami aliran pemprosesan keseluruhan rangka kerja.

Peter_Zhu

Pertama sekali, penyahpepijatan diperlukan untuk mana-mana bahasa. Jika bahasa tidak menyediakan alat penyahpepijatan yang baik. Jadi bahasa adalah secebis. Terutama saya benci beberapa apa yang dipanggil debugging yang tidak diperlukan. Program yang disusun seperti yang ditulis.

Cara untuk mempelajari sesuatu ialah. Mari kita lihat buku pengenalan dahulu. Baca sekali lagi. Baru faham konsep. Kemudian kod seperti yang diperlukan. Yang pertama boleh disusun dengan jayanya (C++). Atau boleh lari (python). negeri ini. Ia bergantung terutamanya pada fungsi pembetulan ralat IDE.

Tunggu sehingga pembetulan ralat IDE selesai. Pelbagai masalah akan berlaku selepas berlari. Terutamanya ralat logik atau SegmentFault (C++).
Apa yang perlu dilakukan pada masa ini. Melihat kod berulang kali memang tidak dapat ditanggung.

Secara amnya sesetengah orang akan memberitahu pemula. Printf/System.Out.println/print/ dan output lain untuk menyemak sama ada setiap pembolehubah adalah normal dan mempunyai nilai yang anda inginkan.
Ini tidak dapat diterima oleh orang yang berpengalaman (keperluan untuk dua yang pertama daripada tiga sifat pengaturcara (mudah marah, malas dan angkuh)), dan menulis Print sangat memenatkan. Ia juga akan dipadamkan apabila diterbitkan. Dan sesetengah antara muka panggilan tidak mengetahui nilai pulangan. Buat printf dan jalankannya. Ia memerlukan masa dan tenaga.

Jadi apa yang dilakukan oleh orang yang mahir? nyahpepijat. Ini adalah sumber nyahpepijat yang disebut oleh poster asal.
Saya tidak perlu mencetak lagi. Anda boleh menyemak terus sama ada setiap data adalah normal. Adakah ia nilai yang dikehendaki?
dalam Java/C++. Nyahpepijat tidak mengapa.
Anda tidak tahu nilai pulangan atau kesan sesuatu fungsi. penyahpepijatan. Berhenti di persekitaran di mana ia perlu dijalankan. Fungsi ujian. Anda boleh mengetahui nilai pulangannya yang sepadan. Tahu bagaimana untuk terus menulis.
Apabila ralat masa jalan muncul pada tindanan, tetapkan titik putus kepada tindanan yang sepadan secara langsung. Sekeping kod yang manakah menyebabkan masalah? Jelas sekali imbas pembolehubah yang mempunyai nilai nol.
Terdapat juga proses menjalankan program. Melakukan beberapa operasi. Anda juga boleh menjejaki proses pelaksanaan kod dengan mengawal nyahpepijat. Inilah fungsi pembelajaran yang dinyatakan oleh poster.

Tetapi ini hanyalah nyahpepijat.
Terdapat dua perkara lagi pada penghujungnya:
Satu ialah Log: anda tidak dibenarkan menyahpepijat dalam talian. Apa yang perlu dilakukan jika berlaku masalah. Log perkara yang anda fikirkan sebagai masalah, dan ia akan menjadi jelas untuk mencari pepijat apabila tiba masanya. .
Satu ialah Ujian: hanya ujian unit. Ujian ialah cara lain untuk memastikan kod anda OK. Sebagai contoh, anda menulis sebahagian kecil projek. Dan fungsi utama di bahagian ini adalah sangat jauh. Hanya keadaan yang sangat istimewa yang terlibat dalam kod anda. (Sudah tentu, Java/Python boleh menulis fungsi Utama tanpa had, tetapi ada yang tidak boleh). Tetapi selepas anda menulis ujian unit. Mulakan terus dengan ujian unit. kebaikan. Simulasikan input dan output yang anda inginkan. Ralat fungsi boleh ditemui dalam masa. Tidak perlu menulis projek besar secara keseluruhan. Kemudian saya mencari ralat dalam susunan yang tidak terkira banyaknya.
Selain itu, ujian unit boleh menghapuskan pepijat dalam persekitaran tertentu. Contohnya, kod anda berjalan seperti biasa pada komputer anda. Semua berpuas hati. Tetapi ia tidak berfungsi dengan betul pada komputer lain. Dengan ujian unit, anda boleh mengetahui sekeping kod yang mempunyai masalah dengan cepat.

Andaikata anda tiba di sini. Saya percaya anda sudah pun seorang pengaturcara yang berkelayakan.

Tetapi tuan mempunyai dua perkara lagi. Ujian prestasi dan analisis prestasi. ke tahap ini. Anda perlu mempunyai pengetahuan mendalam tentang setiap bahasa atau pengetahuan asas mesin maya. Saya tidak akan cakap banyak untuk newbie seperti saya

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan