کتاب Building a Debugger: Write a Native x64 Debugger From Scratch (ساختن یک دیباگر: یک دیباگر x64 بومی را از ابتدا بنویسید) یک راهنمای جامع و عملی برای ساخت یک اشکالزدای خط فرمان برای کد بومی x64 از صفر است.
این کتاب با تشریح مفاهیم پایهای مانند عملکرد اشکالزداها، معماری کامپیوتر، فرآیند کامپایل و سیستمعامل لینوکس آغاز شده و سپس به صورت گام به گام خواننده را در پیادهسازی ویژگیهای مختلف یک اشکالزدا از جمله تنظیم نقاط توقف نرمافزاری و سختافزاری، خواندن و دستکاری حافظه، بررسی ثباتها، مدیریت سیگنالها و فراخوانهای سیستمی، کار با فایلهای شیء و اطلاعات اشکالزدایی (مانند DWARF) و در نهایت پشتیبانی از گامبرداری در سطح کد منبع، باز کردن پشته و اشکالزدایی برنامههای چندریسمانی و کتابخانههای اشتراکی راهنمایی میکند. هدف نهایی این کتاب، درک عمیق از نحوه عملکرد اشکالزداها و سیستمهای کامپیوتری در سطح پایین و توانایی ساخت یک ابزار اشکالزدای کاربردی است.
در ادامه مقدمهای از کتاب Building a Debugger را از زبان نویسنده شرح خواهیم داد.
مقدمهای بر کتاب Building a Debugger:
آیا تا به حال یک نقطه توقف (breakpoint) روی یک خط کد قرار دادهاید و تعجب کردهاید که چگونه کار میکند؟ یا مقدار یک متغیر را چاپ کردهاید و کنجکاو شدهاید که اشکالزدا (debugger) چگونه میدانسته در کدام قسمت حافظه به دنبال آن بگردد؟ یا شاید میخواهید بدانید وقتی به فرآیندهای موجود متصل میشوید و آنها را تحت کنترل خود درمیآورید، در اعماق رایانه شما چه اتفاقی میافتد.
اگر چنین است، کتاب Building a Debugger برای شماست. کتاب «ساخت یک اشکالزدا» جعبههای سیاه را که اشکالزداها اغلب به نظر میرسند، رمزگشایی میکند. این کتاب نحوه عملکرد آنها را آشکار میکند و شما را در ساختن یکی از آنها راهنمایی میکند، از یک پوشه خالی در سیستم فایل شما شروع میشود و به یک ابزار کاربردی ختم میشود که میتواند برنامههای شما را گام به گام اجرا کند، نقاط توقف تنظیم کند، متغیرها را بخواند و کارهای بیشتری انجام دهد. در این مسیر، دانش فراوانی در مورد لینوکس، سیستمعاملها به طور کلی و عملکردهای سطح پایین سیستمهای رایانهای کسب خواهید کرد.
اشکالزدا چیست؟
همه چیز با یک پروانه شروع شد. در سال 1947، تیمی در دانشگاه هاروارد روی رایانه الکترومکانیکی هاروارد مارک II کار میکردند. این ماشین بزرگ بیش از 20 تن وزن داشت و بیش از 370 متر مربع فضا را اشغال میکرد.
در 9 سپتامبر، این تیم در حال عیبیابی مشکلی در مارک II بود و منبع آن را به یک عامل غیرمعمول ردیابی کرد: یک پروانه در یکی از رلههای الکترومغناطیسی که ماشین بر اساس آن ساخته شده بود، گیر کرده و باعث اختلال در عملکرد آن شده بود. پس از برداشتن این موجود کوچک، آنها آن را با عبارت «اولین مورد واقعی پیدا شدن یک باگ» به یک دفترچه گزارش چسباندند. در حالی که دانشمندان علوم کامپیوتر قبل از این حادثه از اصطلاح «باگ» استفاده کرده بودند، مرگ این پروانه بیچاره به استفاده گسترده از آن در واژگان کمک کرد.
با این حال، بیشتر اوقات، ما به دنبال باگهای واقعی در سیستمهای خود نیستیم، بنابراین برای شناسایی مشکلات به پیچگوشتی و ذرهبین نیاز نداریم. در عوض، به برنامهای نیاز داریم که بتواند وضعیت یک برنامه دیگر در حال اجرا در سیستم ما را ردیابی، دستکاری و تجسم کند. چنین برنامهای اشکالزدا نامیده میشود.
توسعهدهندگان معمولاً از اشکالزداها برای کارهایی مانند ردیابی جریان کنترل کد خود در حین اجرا، بررسی مقادیر متغیرها در نقاط مختلف اجرا، متوقف کردن برنامه در مکانهای از پیش تعیینشده و اجرای توابع در داخل فرآیند در حال اجرا استفاده میکنند.
در این کتاب، ما به طور خاص به اشکالزداها برای کد کامپایلشده که مستقیماً روی واحد پردازش مرکزی (CPU) شما اجرا میشود و به زبانی مانند C، C++، Rust یا FORTRAN نوشته شده است، میپردازیم. اشکالزداها برای این برنامهها باید مستقیماً با سیستمعامل و سختافزار زیربنایی ارتباط برقرار کنند، که میتواند ما را به بینشهای عمیقی در مورد نحوه عملکرد واقعی رایانهها برساند.
چه چیزی خواهیم ساخت؟
در طول این کتاب، ما یک اشکالزدای خط فرمان برای کد بومی خواهیم ساخت. من این اشکالزدا را sdb، مخفف Sy’s Debugger، مینامم، اما شما میتوانید نام دیگری برای آن انتخاب کنید. (با این حال، ممکن است بخواهید از تداخل با نام اشکالزداهای موجود مانند GDB و LLDB خودداری کنید.)
در ابتدا، پروژه از یک فایل اجرایی واحد به نام sdb تشکیل خواهد شد که کاربر میتواند از طریق خط فرمان با آن تعامل داشته باشد. با پیشرفت، ما بیشتر اشکالزدا را به عنوان یک کتابخانه، libsdb، خواهیم ساخت و سپس یک درایور خط فرمان خواهیم نوشت که از قابلیتهای آن استفاده میکند. این طراحی نوشتن تستهای خودکار برای کد را آسانتر میکند و شما را قادر میسازد تا برنامههایی را توسعه دهید که به صورت برنامهنویسی با اشکالزدا تعامل دارند.
زبان مبدأ
ما کد منبع اشکالزدا را با ++C نسخه 17 خواهیم نوشت. با این حال، تکنیکهایی که به شما آموزش خواهم داد مختص ++C نیستند و اگر مایل باشید میتوانید زبان دیگری را انتخاب کنید. در حالی که مدیریت برخی از مکانیزمهای سطح پایین در یک زبان کامپایلشده مانند C، ++C یا Rust آسانتر است، هیچ چیز مانع از ترجمه کد کتاب به یک زبان سطح بالاتر مانند پایتون نخواهد شد.
کد sdb در آدرس https://github.com/TartanLlama/sdb در دسترس است. هر فصل شاخه جداگانه خود را دارد. به عنوان مثال، کد فصل 1 در آدرس https://github.com/TartanLlama/sdb/tree/chapter-1 در دسترس است.
کتاب Building a Debugger دانش پایه ای از ++C را فرض می کند. اگر با سایر زبان های مشابه C آشنا باشید، ممکن است بتوانید بدون مشکل زیادی مطالب را دنبال کنید. برای مرور ++C، من مرجع آنلاین https://cppreference.com و کتاب C++ Crash Course (No Starch Press, 2019) نوشته جاش لوسپینوسو را توصیه می کنم. من همچنین برخی از ویژگی های پیشرفته یا مدرن ++C را در بخش های متنی جداگانه توضیح خواهم داد.
محدودیتها
اشکالزدایی که در کتاب Building a Debugger خواهیم نوشت، ایمن برای ریسمانها (thread-safe) نخواهد بود. ما فرض خواهیم کرد که فقط یک ریسمان از آن استفاده می کند و من هیچ تضمینی نمی دهم که اگر سعی کنید از آن در یک زمینه چندریسمانی استفاده کنید، کار کند. من این طراحی را انتخاب کردم زیرا ایمن کردن پروژه برای ریسمان ها به کد بسیار بیشتری غیرمرتبط با فعالیت های اصلی اشکال زدا نیاز دارد. اگر مایل باشید، می توانید اشکال زدای خود را به طور مستقل ایمن برای ریسمان ها کنید.
در کتاب Building a Debugger چه چیزی وجود دارد؟
در هر فصل، ما به یکی از ویژگیهای اشکالزدا میپردازیم، پیشزمینههای لازم برای درک نحوه عملکرد آن را بررسی میکنیم و کدی را برای پیادهسازی آن اضافه میکنیم:
فصل 1: تنظیم پروژه شما را در مراحل تنظیم محیط خود برای ساخت اشکالزدا راهنمایی میکند.
فصل 2 کتاب Building a Debugger: کامپایل و معماری کامپیوتر دانش نظری مورد نیاز برای کار با کتاب Building a Debugger، از جمله اطلاعاتی در مورد فضای کاربری و فضای هسته در لینوکس، فرآیند کامپایل، نحوه بارگیری برنامهها توسط سیستمعامل و موارد دیگر را در اختیار شما قرار میدهد.
فصل 3: اتصال به یک فرآیند شما را در مراحل راهاندازی و اتصال به فرآیندهای لینوکس راهنمایی میکند و پیادهسازی کتابخانه اشکالزدا و درایور خط فرمان را آغاز میکند.
فصل 4 کتاب Building a Debugger: پایپها، procfs و تست خودکار روشهایی برای ارتباط بین فرآیندی در لینوکس و استفاده از سیستم فایل فرآیند (procfs) برای دریافت اطلاعات در مورد فرآیندهای موجود در سیستم را معرفی میکند و به شما کمک میکند تا مجموعه تست خودکار برای اشکالزدا را آغاز کنید.
فصل 5: ثباتها جزئیات ثباتهای سختافزاری موجود در سیستمهای x64، از جمله ثباتهای چندمنظوره، ممیز شناور و اشکالزدایی و نحوه تعامل اشکالزدا با آنها را شرح میدهد.
فصل 6 کتاب Building a Debugger: آزمایش ثباتها با اسمبلی x64 مقدمهای بر زبان اسمبلی x64 ارائه میدهد و نحوه استفاده از آن برای آزمایش قابلیتهای ثبات سختافزاری پیادهسازی شده در فصل قبل را نشان میدهد.
فصل 7: نقاط توقف نرمافزاری نحوه عملکرد نقاط توقف نرمافزاری در سیستمهای x64 را توضیح میدهد و شما را در افزودن پشتیبانی از آنها به اشکالزدا راهنمایی میکند.
فصل 8 کتاب Building a Debugger: حافظه و جداسازی دستورالعمل به شما کمک میکند تا ویژگیهایی برای خواندن و دستکاری حافظه فرآیندهای در حال اجرا و جداسازی کد ماشین در حال اجرا اضافه کنید.
فصل 9: نقاط توقف سختافزاری و نقاط دیدبانی به شما کمک میکند تا پشتیبانی از نقاط توقف سختافزاری و نقاط دیدبانی حافظه را به اشکالزدا اضافه کنید.
فصل 10: سیگنالها و فراخوانهای سیستمی درک شما از سیگنالهای یونیکس و فراخوانهای سیستمی لینوکس را عمیقتر میکند و به شما کمک میکند تا قابلیتهای اشکالزدا را برای مدیریت آنها گسترش دهید.
فصل 11: فایلهای شیء فرمت فایل شیء ELF برای لینوکس را معرفی میکند و شما را در نوشتن یک تجزیهگر برای آن راهنمایی میکند.
فصل 12 کتاب Building a Debugger: اطلاعات اشکالزدایی فرمت اطلاعات اشکالزدایی برای فایلهای شیء لینوکس را معرفی میکند و به شما کمک میکند تا یک تجزیهگر برای آن فرمت پیادهسازی کنید.
فصل 13: جدولهای خط نحوه رمزگذاری نگاشت بین کد منبع و کد ماشین توسط اطلاعات اشکالزدایی را شرح میدهد و جزئیات نوشتن یک تجزیهگر برای این اطلاعات را ارائه میدهد.
فصل 14 کتاب Building a Debugger: نقاط توقف و گامبرداری در سطح کد منبع به شما کمک میکند تا از فرمتهای اطلاعات اشکالزدایی شرح داده شده در فصلهای قبل برای پیادهسازی نقاط توقف و گامبرداری کد در سطح کد منبع به جای سطح کد ماشین استفاده کنید.
فصل 15: اطلاعات قاب فراخوانی فرمتی را که لینوکس برای رمزگذاری طرحبندی پشته فراخوانی برنامه استفاده میکند، شرح میدهد و شما را در پیادهسازی یک تجزیهگر برای آن راهنمایی میکند.
فصل 16 کتاب Building a Debugger: باز کردن پشته نحوه استفاده از تجزیهگر ایجاد شده در فصل قبل برای پیادهسازی یک بازکننده پشته را شرح میدهد که میتواند ردگیری پشته برنامه را تولید کند و ثباتهای سختافزاری را به مقادیری که قبل از شروع یک فراخوانی تابع داشتند، بازگرداند.
فصل 17: کتابخانههای اشتراکی جزئیات نحوه بارگیری و ردیابی کتابخانههای اشتراکی توسط سیستمهای لینوکس را شرح میدهد و به شما کمک میکند تا اشکالزدا را برای پشتیبانی از اشکالزدایی کدی که از یک کتابخانه اشتراکی بارگیری شده است، گسترش دهید.
فصل 18 کتاب Building a Debugger: چندریسمانی نحوه استفاده لینوکس از ریسمانها برای پشتیبانی از برنامههایی که چندین کار را به طور همزمان اجرا میکنند، شرح میدهد و به شما کمک میکند تا پشتیبانی از اشکالزدایی برنامههای چندریسمانی را به اشکالزدا اضافه کنید.
فصل 19: عبارات DWARF نحوه رمزگذاری مکان متغیرها در یک برنامه در حال اجرا توسط عبارات DWARF را بررسی میکند و شما را در گسترش تجزیهگر اطلاعات اشکالزدایی برای پشتیبانی از آنها راهنمایی میکند.
فصل 20 کتاب Building a Debugger: متغیرها و انواع فرمت توضیحات متغیر و نوع در اطلاعات اشکالزدایی را پوشش میدهد و به شما کمک میکند تا پشتیبانی اولیه برای تجسم محتویات متغیر در اشکالزدا اضافه کنید.
فصل 21: ارزیابی عبارت شما را در نوشتن یک موتور ارزیابی عبارت ساده راهنمایی میکند که به کاربران اشکالزدا اجازه میدهد تا فراخوانیهای تابع را در داخل فرآیند در حال اجرا انجام دهند.
فصل 22 کتاب Building a Debugger: مباحث پیشرفته به طور خلاصه برخی دیگر از ویژگیهای اشکالزدا را شرح میدهد که اگر میخواهید اشکالزدای خود را بیشتر گسترش دهید، میتوانید به طور مستقل در مورد آنها تحقیق کنید.
اکثر فصلها با مجموعهای از سؤالات برای آزمایش دانش شما به پایان میرسند. پاسخهای نمونه این سؤالات را در پیوست کتاب Building a Debugger خواهید یافت.
سرفصلهای کتاب Building a Debugger:
- Cover Page
- Title Page
- Copyright Page
- About the Author
- About the Technical Reviewer
- BRIEF CONTENTS
- CONTENTS IN DETAIL
- ACKNOWLEDGMENTS
- INTRODUCTION
- LIST OF ABBREVIATIONS
- 1 PROJECT SETUP
- 2 COMPILATION AND COMPUTER ARCHITECTURE
3 ATTACHING TO A PROCESS - 4 PIPES, PROCFS, AND AUTOMATED TESTING
5 REGISTERS - 6 TESTING REGISTERS WITH X64 ASSEMBLY
- 7 SOFTWARE BREAKPOINTS
- 8 MEMORY AND DISASSEMBLY
- 9 HARDWARE BREAKPOINTS AND WATCHPOINTS
- 10 SIGNALS AND SYSCALLS
- 11 OBJECT FILES
- 12 DEBUG INFORMATION
- 13 LINE TABLES
- 14 SOURCE-LEVEL BREAKPOINTS AND STEPPING
- 15 CALL FRAME INFORMATION
- 16 STACK UNWINDING
- 17 SHARED LIBRARIES
- 18 MULTITHREADING
- 19 DWARF EXPRESSIONS
- 20 VARIABLES AND TYPES
- 21 EXPRESSION EVALUATION
- 22 ADVANCED TOPICS
- APPENDIX: CHECK YOUR KNOWLEDGE ANSWERS
- GLOSSARY
- INDEX
جهت دانلود کتاب Building a Debugger میتوانید پس از پرداخت، دریافت کنید.
دیدگاهها
هیچ دیدگاهی برای این محصول نوشته نشده است.