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 پس از اجرا به آن متصل می‌شود، به شرح زیر است. این عمل کتابخانه‌های اشکال‌زدایی درون‌فرآیندی (in-process) را بارگذاری کرده و نوع اتصال را مشخص می‌نماید.

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> برای شناسایی کد مقداردهی اولیه ایستا (static initialization) برای MyClass استفاده می‌کند.

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

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

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

هنگامی که استثنایی (exception) رخ دهد که در هیچ کجای پشته فراخوانیِ ریسه پرتاب‌کننده، دستور 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 اجرا می‌کند.
تمام ریسه‌ها، از جمله ریسه‌های مجازی را هم‌زمان با ایجادشان ردگیری می‌کند. بخش کار با ریسه‌های مجازی (Working With Virtual Threads) در ادامه را ببینید.
برنامه را در Java HotSpot VM server اجرا می‌کند.
گزینه option را به JVM مربوط به JDB ارسال می‌کند، که در آن option یکی از گزینه‌های شرح‌داده‌شده در صفحه راهنمای راه‌انداز برنامه جاوا (Java application launcher) است. برای نمونه، -J-Xms48m حافظه راه‌اندازی را روی ۴۸ مگابایت تنظیم می‌کند. بخش Overview of Java Options در java را ببینید.

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

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

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

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

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

2026 JDK 26.0.2.1