2-4- معرفی خطایاب پروژه GNU (GBD)

بیایید نگاهی به ابزارهای خطایابی C/C++ بیاندازیم. اصلا خطایابی چیست؟ خطایاب برنامه‌ای است که با اجرا و کنترل برنامه‌ای دیگر، هر خط کد آن را بررسی کرده تا مشکلات و باگ‌های آن را شناسایی کند.

لینوکس اوبونتو دارای خطایابی با نام GNU Debugger است که مختصرا GDB[14] نیز نامیده می‌شود. این خطایاب یکی از برنامه‌های محبوب C و C++ در سیستم لینوکس است.

2-4-1- نصب GBD در اوبونتو لینوکس

در نسخه‌های اخیر اوبونتو gdb وجود دارد و نیازی به نصب آن نیست. اگر از نسخه‌های دیگر استفاده می‌کنید، می‌توانید از دستور زیر برای نصب آن استفاده کنید.

$ sudo apt-get install gdb

2-4-2- تایید نصب

برای بررسی اینکه آیا GDB به درستی بر روی رایانه شما نصب شده است، از دستور زیر استفاده کنید. هنگامی‌که gdb را در ترمینال خود تایپ می‌کنید، پیام شکل 2-3 باید نمایش داده شود.

$ gdb

شکل ‏2‑3: آزمایش کردن دستور gdb

می‌توانید نسخه gdb را با استفاده از دستور زیر ببینید. البته نسخه gdb هنگام وارد کردن دستور gdb نیز نمایش داده می‌شود.

$ gdb version

در بخش بعد، اولین کد C++ را در اوبونتو نوشته، آن را کامپایل کرده و برای پیدا کردن خطاهای کد، آن را خطایابی می‌کنیم.

2-4-3- نوشتن اولین کدتان

بیایید نوشتن اولین برنامه در لینوکس اوبونتو را شروع کنیم. برای نوشتن کد از یک ویرایشگر متن در اوبونتو استفاده کنید. ویرایشگرهای متن ترجیحی gedit یا nano هستند. gedit ویرایشگر متن محبوب GUI در اوبونتو است. با nano در بخش اول کار کردیم، اکنون gedit را بررسی می‌کنیم.

در دش اوبونتو، gedit را جستجو کرده و آنرا انتخاب کنید (به شکل 2-4 نگاه کنید).

شکل ‏2‑4: جستجو برای ویرایشگر متن gedit در جستجوی اوبونتو

با کلیک بر روی ویرایشگر متن، پنجره ی شکل 2-5 نمایش داده می‌شود.

شکل ‏2‑5: ویرایشگر متن gedit

این ویرایشگر بسیار شبیه به Notepad یا WordPad در ویندوز است. اولین کد C++ خود را در این ویرایشگر متن می‌نویسیم.

شکل 2-6 اولین کد C++ را نشان می‌دهد که آنرا در لینوکس کامپایل خواهیم کرد.

شکل ‏2‑6: ویرایشگر متن gedit

کد را در ویرایشگر متن بنویسید و آن را با عنوان hello_world.cpp ذخیره کنید.

2-4-3-1- تشریح کد

کد hello_world.cpp پیام “Hello Ubuntu Linux” را چاپ می‌کند. #include <iostream> یک فایل سربرگ C++ برای توابع ورودی/ خروجی مانند وارد کردن داده از صفحه کلید یا چاپ پیام در خروجی است. در این برنامه، فقط یک پیام‌ در خروجی چاپ می‌کنیم، بنابراین تنها سربرگ iostream کافی خواهد بود. خط بعدی دلالت بر استفاده از فضای نام std دارد.

فضای­نام[15] ویژگی خاصی در C++ برای گروه بندی مجموعه‌ای از اجزا است. فضای­نام std در کتابخانه iostream استفاده می‌شود. وقتی فضای­کاری std را به کار می‌بریم، می‌توانیم به توابع و یا سایر اجزاء موجود در فضای­نام std مانند توابع cout و cin دسترسی پیدا کنیم. اگر از این خط در کد استفاده نمی‌کردیم، باید عبارت std:: برای دسترسی به توابع داخل این فضای نامی‌ را به صورت std :: cout ذکر می‌کردیم. تابع cout پیام را در خروجی چاپ می‌کند.

پس از بحث در مورد فایل سربرگ و سایر خطوط کد، اکنون می‌توانیم در مورد آنچه در تابع اصلی قرار دارد صحبت کنیم. از cout << “Hello Ubuntu Linux” << endl; برای چاپ پیام استفاده می‌کنیم. عبارت endl پس از چاپ پیام یک خط جدید اضافه می‌کند. پس از چاپ پیام، تابع عدد صفر را باز می‌گرداند و از برنامه خارج می‌شود.

2-4-4- کامپایل کدتان

پس از ذخیره کد، گام بعدی کامپایل کد است. فرآیند زیر برای کامپایل کد کمکتان خواهد کرد.

یک ترمینال جدید باز کنید و مسیر ترمینال را به پوشه‌ای که کد را در آن ذخیره کرده اید ببرید. ما کد را در پوشه /home/Desktop ذخیره کرده‌ایم. برای تغییر مسیر ترمینال به پوشه دسکتاپ، باید از دستور “cd” مانند زیر استفاده کنید.

$ cd Desktop

اگر کد خود را در پوشه home ذخیره کرده اید، لازم به اجرا این دستور نیست.

پس از ورود به پوشه دسکتاپ، ls را تایپ کنید تا فهرست فایل‌های آن را ببینید (به شکل 2-7 نگاه کنید).

شکل ‏2‑7: فهرست فایل‌های موجود در پوشه Desktop

اگر کد شما در پوشه باشد، می‌توانید این کامپایل را با استفاده از دستور زیر انجام دهید.

$  g ++ hello_world.cpp

کامپایلر G++ کد را بررسی کرده و اگر خطایی وجود نداشته باشد، یک فایل اجرایی با نام a.out ایجاد می‌کند. شما می‌توانید این فایل را با استفاده از دستور زیر اجرا کنید (به شکل 2-8 نگاه کنید).

$ ./a.out

خروجی به شکل زیر نمایش داده می‌شود

Hello Ubuntu Linux

شکل ‏2‑8: اجرا کردن خروجی اجرایی

تبریک می‌گویم! با موفقیت اولین کد C++ خود را کامپایل و اجرا کردید. اکنون برخی از آپشن‌های g++ که در بخش‌های آینده مفید هستند را بررسی می‌کنیم.

اگر می‌خواهید فایل اجرایی با نام خاصی ایجاد شود، می‌توانید از دستور زیر استفاده کنید.

$ g ++ hello_world.cpp -o hello_world

گزاره –o به‌نام اجرایی تولیدی اشاره دارد. بنابراین، دستور قبل، یک فایل اجرایی با نام hello_world ایجاد می‌کند که می‌توانید با استفاده از دستور زیر آن را اجرا کنید.

$ ./hello_world

خروجی دستورات قبلی در شکل 2-9 نشان داده شده است.

شکل ‏2‑9: اجرای فایل اجرایی hello_world

2-4-5- خطایابی کدتان

با استفاده از ابزار خطایاب، می‌توانیم به هر خط کد رفته و مقادیر هر متغیر را بررسی کنیم. شکل 2-10 کد C++ محاسبه مجموع دو متغیر را نشان می‌دهد. این کد را با نام sum.cpp ذخیره کنید.

شکل ‏2‑10: کد C++ برای جمع دو عدد

برای اصلاح/ بازبینی هر خط کد، باید sum.cpp را با استفاده از گزاره -g  دستور g++ کامپایل کنید. این دستور کد را با نمادهای خطایابی ساخته و آن را قادر می‌سازد با GDB کار کند.

دستور زیر کمک کرده تا کد با نمادهای خطایابی کامپایل شود.

$  g ++ -g sum.cpp -o sum

پس از کامپایل، آن را با دستور زیر اجرا کنید.

$ . /sum

برای خطایابی، از GDB استفاده کنید. خروجی مجموعه دستورات قبلي در شکل 2-11 نشان داده شده است.

شکل ‏2‑11: کامپایل کردن sum.cpp

پس از ایجاد فایل اجرایی، می‌توانید با استفاده از دستور زیر، فایل اجرایی را خطایابی کنید.

$ gdb sum

sum نام فایل اجرایی است. پس از ورود به دستور، باید از دستورات GDB برای ادامه خطایابی استفاده کنید. دستورات زیر، دستورات GDB مهم هستند که باید آنها را به خاطر داشته باشید.

  • b line_numer : یک نقطه شکست در شماره خط داده شده ایجاد می‌کند به صورتیکه خطایابی در این نقطه شکست متوقف می‌شود.
  • n: خط بعدی کد را اجرا می‌کند.
  • r : برنامه را تا نقطه توقف اجرا می‌کند.
  • p variable_name : ارزش یک متغیر را چاپ می‌کند.
  • q : خروج از خطایابی.

بیایید این دستورات را امتحان کنیم.ض خروجی هر دستور در شکل 2-12 نشان داده شده است.

شکل ‏2‑12: خطایابی برنامه جمع

حالا که اصول کامپایل و خطایابی را یاد گرفتیم، شروع به یادگیری مفاهیم OPP در C++ خواهیم کرد. بخش زیر برخی مفاهیم مهم را که در فصل‌های آینده مورد نیاز هستند، مورد بحث قرار می‌دهد.

[14] www.gnu.org/software/gdb/

[15] www.geeksforgeeks.org/namespace-in-c/