در C++، Debugging (رفع خطا و اشکالزدایی) به معنای پیدا کردن و اصلاح مشکلات کد است تا برنامه درست اجرا شود. Debugging شامل شناسایی Compile-time Errors، Runtime Errors، Logical Errors و بررسی جریان برنامه است.
🔹 1️⃣ روشهای معمول Debugging
1. چاپ مقادیر (Print Debugging)
سادهترین روش، استفاده از cout
برای بررسی مقدار متغیرها یا رسیدن به یک نقطه از برنامه است.
#include <iostream>
using namespace std;
int main() {
int sum = 0;
for(int i = 1; i <= 5; i++) {
sum += i;
cout << "i = " << i << ", sum = " << sum << endl; // Debug
}
cout << "Total sum: " << sum << endl;
return 0;
}
📌 این روش برای برنامههای کوچک و سریع مفید است.
2. استفاده از assert
تابع assert
بررسی میکند یک شرط درست باشد و در صورت نادرست بودن، برنامه متوقف میشود.
#include <iostream>
#include <cassert>
using namespace std;
int divide(int a, int b) {
assert(b != 0); // اگر b صفر باشد برنامه متوقف میشود
return a / b;
}
int main() {
cout << divide(10, 2) << endl; // خروجی: 5
cout << divide(10, 0) << endl; // ❌ متوقف میشود
return 0;
}
3. Debugger
Debugger ابزار پیشرفتهای است که با IDE یا ترمینال استفاده میشود:
-
Breakpoint: توقف برنامه در خط خاص برای بررسی مقادیر متغیرها.
-
Step Over: اجرای خط به خط بدون وارد شدن به توابع.
-
Step Into: ورود به توابع برای بررسی دقیقتر.
-
Watch Variables: مشاهدهٔ مقدار متغیرها در زمان اجرا.
📌 مثال IDE: Visual Studio, CLion, Code::Blocks, gdb.
4. بررسی Runtime Errors با try-catch
استفاده از Exception Handling کمک میکند خطاهای زمان اجرا کنترل شوند و برنامه کرش نکند.
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 0;
try {
if (b == 0) throw "Division by zero!";
cout << a / b << endl;
} catch (const char* msg) {
cout << "Error: " << msg << endl;
}
return 0;
}
5. استفاده از Valgrind (Linux)
-
برای شناسایی Memory Leak و Pointer Errors.
-
دستور مثال:
valgrind ./program
6. ترکیب تکنیکها
-
ابتدا Compile-time Errors را اصلاح کنید.
-
سپس Runtime Errors را با assert یا try-catch مدیریت کنید.
-
در نهایت Logical Errors را با print/debugger بررسی کنید.
🔹 نکات کلیدی Debugging
-
Breakpoints بهترین ابزار برای برنامههای بزرگ هستند.
-
Print Debugging سریع و ساده است ولی برای برنامههای پیچیده محدودیت دارد.
-
همیشه حافظه و منابع را بررسی کنید تا Memory Leak نداشته باشید.
-
Exception Handling باعث اجرای امن برنامه میشود.
💡 خلاصه:
Debugging در C++ ترکیبی از Print Statements، Assert، Try-Catch، Debugger، ابزارهای مدیریت حافظه است و هدف آن پیدا کردن و رفع Compile-time, Runtime, Logical Errors است تا برنامه قابل اعتماد و بدون کرش باشد.