GDB(1) GNU Development Tools GDB(1)

gdb - اشکال‌زدای گنو (GNU Debugger)

gdb [OPTIONS] [prog|prog procID|prog core]

هدف از یک اشکال‌زدا مانند GDB این است که به شما امکان دهد ببینید در «درون» یک برنامهٔ دیگر هنگام اجرا چه می‌گذرد -- یا اینکه برنامهٔ دیگر دقیقاً در لحظهٔ از کار افتادن (crash) مشغول انجام چه کاری بوده است.

GDB می‌تواند چهار کارکرد اصلی (به همراه موارد دیگر در پشتیبانی از آن‌ها) انجام دهد تا به شما در به دام انداختن خطاها هنگام وقوع کمک کند:

  • شروع اجرای برنامه، با تعیین هر چیزی که ممکن است بر رفتار آن تأثیر بگذارد.
  • متوقف کردن برنامه بر اساس شرایط مشخص‌شده.
  • بررسی آنچه رخ داده است، هنگامی که برنامه متوقف شده است.
  • تغییر دادن مواردی در برنامه، تا بتوانید تأثیرات رفع یک باگ را بیازمایید و برای شناسایی باگ‌های دیگر پیش بروید.

می‌توانید از GDB برای اشکال‌زدایی برنامه‌های نوشته‌شده به زبان‌های C، C++، Fortran و Modula-2 استفاده کنید.

GDB با دستور شل "gdb" فراخوانی می‌شود. پس از شروع، دستورها را از ترمینال می‌خواند تا زمانی که با دستور "quit" یا "exit" در GDB به آن فرمان خروج دهید. با استفاده از دستور "help" می‌توانید از خود GDB راهنمای برخط دریافت کنید.

می‌توانید "gdb" را بدون هیچ آرگومان یا گزینه‌ای اجرا کنید؛ اما معمول‌ترین روش برای اجرای GDB همراه با یک یا دو آرگومان است که در آن یک برنامهٔ اجرایی به عنوان آرگومان مشخص می‌شود:

gdb program

همچنین می‌توانید برنامه را هم‌زمان با یک برنامهٔ اجرایی و یک فایل core مشخص‌شده اجرا کنید:

gdb program core

اگر می‌خواهید یک فرایند در حال اجرا را اشکال‌زدایی کنید، می‌توانید در عوض یک شناسهٔ فرایند (ID) را به عنوان آرگومان دوم تعیین کنید یا از گزینهٔ "-p" بهره ببرید:

gdb program 1234
gdb -p 1234

این دستور GDB را به فرایند 1234 متصل می‌کند. با استفاده از گزینهٔ -p می‌توانید نام فایل program را نادیده بگیرید.

در اینجا برخی از پرکاربردترین دستورهای GDB آورده شده است:

تنظیم یک نقطه توقف (breakpoint) در function یا line (در file).
شروع اجرای برنامه (به همراه arglist، در صورت تعیین).
ردگیری به عقب (Backtrace): نمایش پشتهٔ برنامه.
نمایش مقدار یک عبارت.
ادامهٔ اجرای برنامه (پس از توقف، برای نمونه در یک نقطه توقف).
اجرای خط بعدی برنامه (پس از توقف)؛ رد شدن (over) از روی هرگونه فراخوانی تابع در آن خط.
مشاهدهٔ خطی از برنامه که در حال حاضر در آن متوقف شده است.
چاپ متن برنامه در حوالی جایی که در حال حاضر در آن متوقف شده است.
اجرای خط بعدی برنامه (پس از توقف)؛ ورود (into) به درون هرگونه فراخوانی تابع در آن خط.
نمایش اطلاعات دربارهٔ دستور name در GDB، یا اطلاعات کلی دربارهٔ نحوهٔ استفاده از GDB.
خروج از GDB.

برای جزئیات کامل دربارهٔ GDB، راهنمای Using GDB: A Guide to the GNU Source-Level Debugger نوشتهٔ Richard M. Stallman و Roland H. Pesch را ببینید. همین متن به‌صورت برخط با مدخل "gdb" در برنامهٔ "info" نیز در دسترس است..SH "گزینه‌ها (OPTIONS)" هر آرگومانی به جز گزینه‌ها، یک فایل اجرایی و فایل core (یا شناسه فرایند ID) را مشخص می‌کند؛ بدین معنا که نخستین آرگومانِ ارائه‌شده بدون پرچمِ گزینه، معادل گزینهٔ --se است، و دومی، در صورت وجود، چنانچه نام یک فایل باشد معادل گزینهٔ -c خواهد بود. بسیاری از گزینه‌ها هر دو شکل کوتاه و بلند را دارند؛ هر دو شکل در اینجا نشان داده شده‌اند. شکل‌های بلند در صورت خلاصه‌سازی نیز شناسایی می‌شوند، به شرطی که به میزان کافی از نام گزینه برای رفع ابهام موجود باشد.

شکل‌های کوتاه در اینجا با - و شکل‌های بلند با -- نشان داده شده‌اند تا بیانگر نحوهٔ نمایش آن‌ها در --help باشند. با این حال، GDB تمامی ساختارهای زیر را برای اغلب گزینه‌ها به رسمیت می‌شناسد:

"--option=value"
"--option value"
"-option=value"
"-option value"
"--o=value"
"--o value"
"-o=value"
"-o value"

تمام گزینه‌ها و آرگومان‌های خط فرمان که وارد می‌کنید به صورت ترتیبی پردازش می‌شوند. این ترتیب در صورت استفاده از گزینهٔ -x دارای اهمیت است.

فهرست کردن تمام گزینه‌ها، همراه با توضیحات کوتاه.
خواندن جدول نمادها (symbol table) از file.
فعال کردن امکان نوشتن روی فایل‌های اجرایی و فایل‌های core.
استفاده از file به عنوان فایل اجرایی جهت اجرا در صورت نیاز، و همچنین برای بررسی داده‌های دست‌نخورده در ارتباط با یک core dump.
خواندن جدول نمادها از file و استفاده از آن به عنوان فایل اجرایی.
استفاده از file به عنوان یک core dump جهت بررسی.
اجرای دستورهای GDB از file.
اجرای command مشخص‌شده برای GDB.
اجرای command برای GDB پیش از بارگذاری inferior (برنامهٔ تحت دیباگ).
افزودن directory به مسیر جستجوی فایل‌های منبع.
اجرا نکردن دستورها از ~/.config/gdb/gdbinit، ~/.gdbinit، ~/.config/gdb/gdbearlyinit، یا ~/.gdbearlyinit.
اجرا نکردن دستورها از هیچ‌یک از فایل‌های راه‌اندازی .gdbinit یا .gdbearlyinit.
"خاموش". پیام‌های مقدماتی و حق نشر را چاپ نمی‌کند. این پیام‌ها در حالت دسته‌ای (batch mode) نیز خاموش می‌شوند.
اجرا در حالت دسته‌ای. خروج با وضعیت 0 پس از پردازش تمام فایل‌های دستور مشخص‌شده با -x (و .gdbinit، اگر مهار نشده باشد). در صورت بروز خطا در اجرای دستورهای GDB در فایل‌های دستور، با وضعیتی غیرصفر خارج می‌شود.

حالت دسته‌ای ممکن است برای اجرای GDB به عنوان یک پالایه (filter) مفید باشد، مثلاً برای بارگیری و اجرای یک برنامه روی یک رایانهٔ دیگر؛ به منظور کارآمدتر کردن این ویژگی، پیام

Program exited normally.

(که معمولاً در زمان پایان اجرای هر برنامه‌ای تحت کنترل GDB صادر می‌شود) در صورت اجرا در حالت دسته‌ای صادر نمی‌شود.

اجرا در حالت دسته‌ای، دقیقاً مانند --batch، اما کاملاً در سکوت. تمام خروجی GDB سرکوب می‌شود (خروجی stderr دست‌نخورده می‌ماند). این گزینه بسیار ساکت‌تر از --silent است و برای یک نشست تعاملی بی‌فایده خواهد بود.

این گزینه به خصوص هنگام استفاده از هدف‌هایی که پیام‌های Loading section می‌دهند مفید واقع می‌شود.

توجه داشته باشید هدف‌هایی که خروجی خود را از طریق GDB می‌دهند، برخلاف مواردی که مستقیماً در "stdout" می‌نویسند، نیز بی‌صدا و خاموش خواهند شد.

تغییر تفسیر خط فرمان به گونه‌ای که آرگومان‌های پس از این گزینه به عنوان آرگومان به inferior تحویل داده شوند. برای نمونه، دستور زیر را در نظر بگیرید:
gdb ./a.out -q

این دستور GDB را با -q اجرا می‌کند و پیام مقدماتی را چاپ نمی‌کند. از سوی دیگر، استفاده از:

gdb --args ./a.out -q

برنامهٔ GDB را با پیام مقدماتی آغاز کرده و گزینه را به inferior ارسال می‌کند.

اتصال GDB به یک برنامهٔ در حال اجرا، با شناسهٔ فرایند pid..IP "--tui" 4 رابط کاربری پایانه (TUI) را باز می‌کند.
در نخستین دسترسی، تمام نمادها را از فایل نماد (symfile) داده‌شده می‌خواند.
فایل‌های نماد را نمی‌خواند.
کد خروج GDB برابر با کد خروج فرآیند فرزند خواهد بود.
جزئیات مربوط به پیکربندی GDB را چاپ کرده و سپس خارج می‌شود.
اطلاعات نسخه را چاپ کرده و سپس خارج می‌شود.
GDB را با استفاده از directory به‌عنوان دایرکتوری کاری، به‌جای دایرکتوری جاری اجرا می‌کند.
GDB را با استفاده از directory به‌عنوان دایرکتوری داده‌هایش اجرا می‌کند. دایرکتوری داده مکانی است که GDB در آن به جستجوی فایل‌های کمکی خود می‌پردازد.
ویرایشگر Emacs هنگام اجرای GDB به‌عنوان یک زیرفرآیند، این گزینه را تنظیم می‌کند. این گزینه به GDB می‌گوید هر بار که یک فریم پشته (stack frame) نمایش داده می‌شود (که شامل هر بار توقف برنامه نیز هست)، نام کامل فایل و شماره خط را در قالبی استاندارد و قابل‌تشخیص در خروجی بنویسد. این قالب قابل‌تشخیص شبیه به دو نویسهٔ \032 است که پس از آن‌ها نام فایل، شماره خط و موقعیت نویسه به وسیله دونقطه (:) از هم جدا شده‌اند و در پایان یک خط جدید می‌آید. برنامه رابط Emacs-to-GDB از این دو نویسهٔ \032 به‌عنوان نشانه‌ای برای نمایش کد منبع فریم مربوطه استفاده می‌کند.
سرعت خط (baud rate یا بیت بر ثانیه) را برای هر رابط سریالی که توسط GDB برای اشکال‌زدایی از راه دور استفاده می‌شود، تنظیم می‌کند.
مهلت زمانی (timeout) برای اشکال‌زدایی از راه دور را به ثانیه تنظیم می‌کند.
برنامه را با استفاده از device برای ورودی و خروجی استاندارد آن اجرا می‌کند.

مستندات کامل GDB به‌صورت یک دفترچه راهنمای Texinfo نگهداری می‌شود. اگر برنامه‌های "info" و "gdb" و مستندات Texinfo مربوط به GDB به‌درستی روی سیستم شما نصب شده باشند، دستور

info gdb

باید دسترسی شما به راهنمای کامل را فراهم کند.

Using GDB: A Guide to the GNU Source-Level Debugger، نوشتهٔ Richard M. Stallman و Roland H. Pesch، ژوئیه ۱۹۹۱.

حق نشر (c) ۱۹۸۸-۲۰۲۵ متعلق به Free Software Foundation, Inc. است.

اجازه کپی، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد گنو» (GNU Free Documentation License)، نسخه ۱.۳ یا هر نسخهٔ متأخرتری که توسط بنیاد نرم‌افزار آزاد منتشر شده است، اعطا می‌شود؛ با بخش‌های تغییرناپذیرِ "Free Software" و "Free Software Needs Free Documentation"، با متن‌های روی جلدِ "A GNU Manual"، و با متن‌های پشت جلد طبق بند (a) در ادامه.

(a) متن پشت جلد FSF عبارت است از: "You are free to copy and modify this GNU Manual. Buying copies from GNU Press supports the FSF in developing GNU and promoting software freedom."

2025-12-20 gdb-17.1