فصل 38 از 40 درس 1 از 1

Debugging و عیب‌یابی

Debugging و عیب‌یابی

بخشی از آموزش جامع C# و .NET 10

محتوای درس Debugging و عیب‌یابی

Debugging فرایند سیستماتیک یافتن علت رفتار نادرست است. ابزار Debugger، Breakpoint، Watch و Call Stack باید در کنار خواندن پیام Exception و بازتولید دقیق خطا استفاده شوند.

۱. Breakpoint

Breakpoint اجرای برنامه را در خط مشخص متوقف می‌کند تا State بررسی شود. Conditional Breakpoint برای توقف فقط در وضعیت خاص مفید است.

مثال

int a=10,b=20;
         int total=a+b; // breakpoint
         Console.WriteLine(total);

در این مثال، مفهوم «Breakpoint» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۲. Step Into و Step Over

Step Into وارد Method فراخوانی‌شده می‌شود و Step Over آن را اجرا کرده و در خط بعد متوقف می‌شود.

مثال

static int Add(int a,int b)=>a+b;
         Console.WriteLine(Add(2,3));

در این مثال، مفهوم «Step Into و Step Over» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۳. Watch و Locals

Locals متغیرهای Scope جاری و Watch Expressionهای انتخابی را نمایش می‌دهد.

مثال

for(int i=0;i<10;i++){int square=i*i; Console.WriteLine(square);}

در این مثال، مفهوم «Watch و Locals» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۴. Call Stack

Call Stack مسیر فراخوانی‌ها تا نقطه فعلی را نشان می‌دهد و برای درک منبع خطا حیاتی است.

مثال

var s=new Stack<string>();s.Push("A");s.Push("B");Console.WriteLine(s.Pop());

در این مثال، مفهوم «Call Stack» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۵. Exception Settings

Debugger می‌تواند هنگام Throw شدن Exception و پیش از Catch شدن متوقف شود.

مثال

try{int.Parse("x");}catch(FormatException ex){Console.WriteLine(ex.Message);}

در این مثال، مفهوم «Exception Settings» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۶. روش عیب‌یابی

ابتدا رفتار را بازتولید، دامنه مشکل را کوچک، فرضیه‌ها را آزمایش و پس از اصلاح Regression را بررسی کنید.

مثال

int[] values={10,20,30}; int sum=values.Sum(); double avg=(double)sum/values.Length;

در این مثال، مفهوم «روش عیب‌یابی» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۷. مثال‌های عملی

static decimal Divide(decimal total, int count)
         {
             return total / count;
         }
         
         Console.WriteLine(Divide(100m, 0));

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

۸. خطاهای رایج

• تغییر تصادفی کد بدون فرضیه مشخص

• نادیده گرفتن Stack Trace

• وابستگی صرف به Console.WriteLine برای همه عیب‌یابی‌ها

۹. نکات اجرایی

• نام‌ها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.

• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.

• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.

۱۰. تمرین عملی

برنامه‌ای با سه خطای عمدی ایجاد کنید و با Breakpoint، Watch و Call Stack علت هر خطا را مستند و اصلاح کنید.

۱۱. جمع‌بندی

در این فصل، مبانی «Debugging و عیب‌یابی» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.