JDB(1) JDK Commands JDB(1)

jdb - یافتن و رفع باگ‌ها در برنامه‌های پلتفرم جاوا

jdb [options] [classname] [arguments]

نشان‌دهنده گزینه‌های خط فرمان jdb است. بخش گزینه‌های دستور JDB را ببینید.
نشان‌دهنده نام کلاس اصلی برای اشکال‌زدایی است.
نشان‌دهنده آرگومان‌هایی است که به متد main() کلاس ارسال می‌شوند.

اشکال‌زدای جاوا (JDB) یک اشکال‌زدای خط فرمانی ساده برای کلاس‌های جاوا است. دستور jdb و گزینه‌های آن، ابزار JDB را فراخوانی می‌کنند. دستور jdb معماری اشکال‌زدایی پلتفرم جاوا (Java Platform Debugger Architecture) را به نمایش می‌گذارد و امکان بازرسی و اشکال‌زدایی یک JVM محلی یا راه‌دور را فراهم می‌آورد.

روش‌های متعددی برای شروع یک نشست JDB وجود دارد. رایج‌ترین روش این است که JDB یک JVM جدید را به همراه کلاس اصلی برنامه‌ای که باید اشکال‌زدایی شود راه‌اندازی کند. این کار با جایگزین کردن دستور jdb به جای دستور java در خط فرمان انجام می‌شود. برای نمونه، اگر کلاس اصلی برنامه شما MyClass است، از دستور زیر برای اشکال‌زدایی آن تحت JDB استفاده کنید:

jdb MyClass

هنگامی که به این صورت راه‌اندازی می‌شود، دستور jdb یک JVM ثانویه را با پارامترهای مشخص‌شده فراخوانی کرده، کلاس تعیین‌شده را بارگذاری می‌کند و JVM را پیش از اجرای نخستین دستورالعمل آن کلاس متوقف می‌سازد.

روش دیگر برای استفاده از دستور jdb پیوست کردن (attach) آن به یک JVM است که از پیش در حال اجرا است. نحو راه‌اندازی یک JVM که دستور jdb هنگام اجرا به آن متصل می‌شود به صورت زیر است. این عمل کتابخانه‌های اشکال‌زدایی درون‌فرآیندی را بارگذاری کرده و نوع اتصالی که باید برقرار شود را مشخص می‌سازد.

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n MyClass

سپس می‌توانید دستور jdb را با دستور زیر به JVM متصل کنید:

jdb -attach 8000

عدد 8000 نشانی JVM در حال اجرا است.

در این حالت آرگومان MyClass در خط فرمان jdb مشخص نمی‌شود، زیرا دستور jdb به جای راه‌اندازی یک JVM جدید، به یک JVM موجود متصل می‌شود.

روش‌های بسیار دیگری برای اتصال اشکال‌زدا به یک JVM وجود دارد و همه آن‌ها توسط دستور jdb پشتیبانی می‌شوند. مستندات معماری اشکال‌زدایی پلتفرم جاوا (Java Platform Debugger Architecture) شامل اطلاعات تکمیلی درباره این گزینه‌های اتصال است.

نقاط توقف (Breakpoints) را می‌توان در JDB بر اساس شماره خطوط یا در نخستین دستورالعمل یک متد تعیین کرد، برای نمونه:

  • دستور stop at MyClass:22 یک نقطه توقف در نخستین دستورالعمل خط ۲۲ از فایل منبع حاوی MyClass تنظیم می‌کند.
  • دستور stop in java.lang.String.length یک نقطه توقف در آغاز متد java.lang.String.length تعیین می‌کند.
  • دستور stop in MyClass.<clinit> از <clinit> برای شناسایی کد مقداردهی اولیه ایستای MyClass استفاده می‌کند.

هنگامی که یک متد سربارگذاری (overload) شده باشد، باید نوع آرگومان‌های آن را نیز مشخص کنید تا متد مناسب برای نقطه توقف انتخاب شود. برای نمونه، MyClass.myMethod(int,java.lang.String) یا MyClass.myMethod().

دستور clear با استفاده از نحو روبرو نقاط توقف را حذف می‌کند: clear MyClass:45. استفاده از دستور clear یا stop بدون هیچ آرگومانی، فهرستی از تمام نقاط توقف تنظیم‌شده فعلی را نمایش می‌دهد. دستور cont اجرای برنامه را ادامه می‌دهد.

دستور step اجرا را به خط بعدی پیش می‌برد، چه در قاب پشته (stack frame) فعلی باشد و چه درون یک متد فراخوانی‌شده. دستور next اجرا را به خط بعدی در قاب پشته فعلی پیش می‌برد.

هنگامی که استثنایی رخ می‌دهد و هیچ عبارت catch برای آن در پشته فراخوانیِ رشته پرتاب‌کننده وجود ندارد، JVM معمولاً ردگیری استثنا (trace) را چاپ کرده و خارج می‌شود. اما هنگام اجرا تحت JDB، کنترل در محل پرتاب خطا به JDB بازمی‌گردد. سپس می‌توانید از دستور jdb برای عیب‌یابی علت استثنا استفاده کنید.

از دستور catch استفاده کنید تا برنامه تحت اشکال‌زدایی در سایر استثناهای پرتاب‌شده متوقف شود، برای نمونه: catch java.io.FileNotFoundException یا catch mypackage.BigTroubleException. هر استثنایی که نمونه‌ای از کلاس مشخص‌شده یا زیرکلاس‌های آن باشد، برنامه را در نقطه‌ای که استثنا پرتاب می‌شود متوقف می‌سازد.

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

هنگامی که از دستور jdb به جای دستور java در خط فرمان استفاده می‌کنید، دستور jdb بسیاری از گزینه‌های مشابه دستور java را می‌پذیرد.

گزینه‌های زیر توسط دستور jdb پشتیبانی می‌شوند:

یک پیام راهنما نمایش می‌دهد.
از مسیر مشخص‌شده برای جستجوی فایل‌های منبع استفاده می‌کند. اگر این گزینه مشخص نشود، از مسیر پیش‌فرض نقطه (.) استفاده خواهد شد.
اشکال‌زدا را با سازوکار اتصال پیش‌فرض به یک JVM در حال اجرا متصل می‌کند.
منتظر می‌ماند تا یک JVM در حال اجرا با استفاده از یک رابط اتصال استاندارد به نشانی مشخص‌شده متصل شود.
منتظر می‌ماند تا یک JVM در حال اجرا با استفاده از یک رابط استاندارد به هر نشانیِ در دسترسی متصل گردد.
برنامه تحت اشکال‌زدایی را بلافاصله پس از راه‌اندازی دستور jdb اجرا می‌کند. گزینه -launch نیاز به استفاده از دستور run را برطرف می‌سازد. برنامه تحت اشکال‌زدایی راه‌اندازی شده و سپس دقیقاً پیش از بارگذاری کلاس اولیه برنامه متوقف می‌شود. در این نقطه، می‌توانید هر نقطه توقف لازم را تنظیم کرده و از دستور cont برای ادامه اجرا استفاده کنید.
رابط‌های اتصال (connectors) موجود در این JVM را فهرست می‌کند.
با استفاده از رابط اتصال مشخص‌شده و مقادیر آرگومان‌های فهرست‌شده، به JVM هدف متصل می‌شود.
اطلاعاتی را برای اشکال‌زدایی خودِ دستور jdb چاپ می‌کند.
برنامه را در Java HotSpot VM client اجرا می‌کند.
همه رشته‌ها، از جمله رشته‌های مجازی (virtual threads) را به محض ایجاد شدن ردیابی می‌کند. بخش کار با رشته‌های مجازی را در زیر ببینید.
برنامه را در Java HotSpot VM server اجرا می‌کند.
گزینه option را به JVM مربوط به JDB ارسال می‌کند؛ که در آن option یکی از گزینه‌های شرح داده‌شده در صفحه راهنمای اجراکننده برنامه‌های جاوا است. برای نمونه، -J-Xms48m حافظه راه‌اندازی را روی ۴۸ مگابایت تنظیم می‌کند. بخش Overview of Java Options در java را ببینید.

گزینه‌های زیر به فرآیند تحت اشکال‌زدایی (debuggee) هدایت می‌شوند:

گزینه option را به JVM تحت اشکال‌زدایی ارسال می‌کند؛ که در آن option یکی از گزینه‌های شرح داده‌شده در صفحه راهنمای اجراکننده برنامه‌های جاوا است. برای نمونه، -R-Xms48m حافظه راه‌اندازی را روی ۴۸ مگابایت تنظیم می‌کند. بخش Overview of Java Options در java را ببینید.
حالت پرگو (verbose) را فعال می‌کند.
یک ویژگی سیستمی (system property) را تنظیم می‌کند.
دایرکتوری‌های جداشده با دونقطه را که باید در آن‌ها به دنبال کلاس‌ها گشت، فهرست می‌کند.
یک گزینه غیراستاندارد مربوط به JVM هدف.

گزینه‌های دیگری نیز برای ارائه سازوکارهای جایگزین جهت اتصال اشکال‌زدا به JVM مورد نظر پشتیبانی می‌شوند.

اغلب رشته‌های مجازی در تعداد و بسامدی چنان بالا ایجاد می‌شوند که ممکن است بار زیادی به اشکال‌زدا تحمیل کرده و کارایی آن را مختل کنند. به همین دلیل، JDB به طور پیش‌فرض رشته‌های مجازی را به محض ایجاد شدن ردیابی نمی‌کند. این ابزار تنها رشته‌های مجازی‌ای را ردیابی خواهد کرد که رویدادی برای آن‌ها رخ داده باشد، مانند رویداد یک نقطه توقف. می‌توان از گزینه -trackallthreads استفاده کرد تا JDB تمام رشته‌های مجازی را به محض ایجاد شدن ردیابی نماید.

هنگامی که JDB برای نخستین بار متصل می‌شود، فهرستی از تمام رشته‌های شناخته‌شده را از عامل اشکال‌زدایی (Debug Agent) درخواست می‌کند. به طور پیش‌فرض، عامل اشکال‌زدایی هیچ رشته مجازی‌ای را در این فهرست بازنمی‌گرداند، باز هم به این دلیل که حجم فهرست ممکن است بسیار بزرگ بوده و بر عملکرد اشکال‌زدا اثر منفی بگذارد. عامل اشکال‌زدایی گزینه‌ای به نام includevirtualthreads دارد که می‌توان آن را فعال ساخت تا این رفتار تغییر کند و همه رشته‌های مجازی شناخته‌شده در فهرست گنجانده شوند. گزینه -trackallthreads در JDB باعث می‌شود هنگام راه‌اندازی یک برنامه برای اشکال‌زدایی، JDB به طور خودکار گزینه includevirtualthreads عامل اشکال‌زدایی را فعال کند. با این حال، به خاطر داشته باشید که عامل اشکال‌زدایی ممکن است از رشته‌های مجازی که پیش از اتصال JDB به برنامه تحت اشکال‌زدایی ایجاد شده‌اند، اطلاعی نداشته باشد.

2026 JDK 25.0.4.1