jdb(1) Basic Tools jdb(1)

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

jdb [options] [classname]  [arguments]
گزینه‌های خط فرمان. بخش «گزینه‌ها» را ببینید.
نام کلاس اصلی برای اشکال‌زدایی.
آرگومان‌های ارسال‌شده به متد main() کلاس.

اشکال‌زدای جاوا (JDB) یک اشکال‌زدای ساده خط فرمانی برای کلاس‌های جاوا است. دستور jdb و گزینه‌های آن JDB را فراخوانی می‌کنند. دستور jdb معماری اشکال‌زدای بستر جاوا (JDBA) را به نمایش می‌گذارد و امکان بازرسی و اشکال‌زدایی یک ماشین مجازی جاوا (JVM) محلی یا از راه دور را فراهم می‌کند. بخش معماری اشکال‌زدای بستر جاوا (JDBA) را در http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/index.html ببینید.

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

jdb MyClass

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

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

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

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

jdb -attach 8000

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

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

در ادامه فهرستی از دستورات پایه‌ای jdb آورده شده است. ابزار JDB از دستورات دیگری نیز پشتیبانی می‌کند که می‌توانید آن‌ها را با گزینه -help مشاهده کنید.

help or ?
دستورات help یا ? فهرستی از دستورات شناخته‌شده را همراه با شرحی مختصر نمایش می‌دهند.
پس از راه‌اندازی JDB و تعیین نقاط توقف (breakpoints)، می‌توانید از دستور run برای اجرای برنامه تحت اشکال‌زدایی استفاده کنید. دستور run تنها زمانی در دسترس است که دستور jdb خودش برنامه تحت اشکال‌زدایی را راه‌اندازی کند، نه زمانی که به یک JVM در حال اجرا متصل می‌شود.
اجرای برنامه تحت اشکال‌زدایی را پس از یک نقطه توقف، استثنا (exception) یا گام، ادامه می‌دهد.
اشیای جاوا و مقادیر اولیه (primitive) را نمایش می‌دهد. برای متغیرها یا فیلدهایی از انواع اولیه، مقدار واقعی چاپ می‌شود. برای اشیاء، توصیفی کوتاه چاپ می‌شود. برای آگاهی از نحوه دریافت اطلاعات بیشتر درباره یک شیء، به دستور dump مراجعه کنید.

نکته: برای نمایش متغیرهای محلی، کلاس مربوطه باید با گزینه javac -g کامپایل شده باشد.

دستور print از بسیاری از عبارات ساده جاوا، از جمله مواردی که فراخوانی متد دارند، پشتیبانی می‌کند؛ برای مثال:

print MyClass.myStaticField
print myObj.myInstanceField
print i + j + k (i, j, k are primities and either fields or local variables)
print myObj.myMethod() (if myMethod returns a non-null)
print new java.lang.String("Hello").length()
برای مقادیر اولیه، دستور dump رفتاری مشابه دستور print دارد. برای اشیاء، دستور dump مقدار فعلی هر فیلد تعریف‌شده در شیء را چاپ می‌کند. فیلدهای ایستا (static) و نمونه (instance) هر دو گنجانده شده‌اند. دستور dump از همان مجموعه عباراتِ دستور print پشتیبانی می‌کند.
فهرست ریسه‌هایی (threads) که هم‌اکنون در حال اجرا هستند را نمایش می‌دهد. برای هر ریسه، نام و وضعیت فعلی آن چاپ شده و نمایه‌ای (index) که می‌تواند در سایر دستورات استفاده شود ارائه می‌گردد. در این مثال، نمایه ریسه 4 است، ریسه نمونه‌ای از java.lang.Thread است، نام ریسه main بوده و هم‌اکنون در حال اجرا است.
4. (java.lang.Thread)0x1 main      running
یک ریسه را به عنوان ریسه جاری انتخاب می‌کند. بسیاری از دستورات jdb بر اساس تنظیم ریسه جاری کار می‌کنند. ریسه با استفاده از نمایه ریسه که در دستور threads شرح داده شد تعیین می‌شود.
دستور where بدون آرگومان، پشته (stack) ریسه جاری را تخلیه (dump) و نمایش می‌دهد. دستور whereall پشته تمام ریسه‌ها در گروه ریسه جاری را تخلیه می‌کند. دستور wherethreadindex پشته ریسه مشخص‌شده را تخلیه می‌کند.

اگر ریسه جاری از طریق رویدادی مانند یک نقطه توقف یا از طریق دستور suspend تعلیق شده باشد، می‌توان متغیرها و فیلدهای محلی را با دستورات print و dump نمایش داد. دستورات up و down مشخص می‌کنند که کدام فریم پشته (stack frame)، فریم جاری باشد.

نقاط توقف را می‌توان در JDB بر اساس شماره خطوط یا در نخستین دستورالعمل یک متد تعیین کرد؛ برای مثال:

•
دستور stop at MyClass:22 یک نقطه توقف در نخستین دستورالعمل خط 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 اجرا را به خط بعدی منتقل می‌کند، چه در فریم پشته فعلی باشد و چه در متد فراخوانی‌شده. دستور next اجرا را به خط بعدی در فریم پشته جاری هدایت می‌کند.

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

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

دستور ignore تأثیر دستور قبلی catch را لغو می‌کند. دستور ignore باعث نمی‌شود که JVM استثناهای خاص را نادیده بگیرد، بلکه تنها باعث می‌شود که اشکال‌زدا آن‌ها را نادیده بگیرد.

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

گزینه‌های دیگری نیز برای ارائه سازوکارهای جایگزین جهت اتصال اشکال‌زدا به JVM مورد نظر پشتیبانی می‌شوند. برای مستندات تکمیلی درباره این روش‌های اتصال، معماری اشکال‌زدای بستر جاوا (JPDA) را در http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/index.html ببینید.


پیام راهنما را نمایش می‌دهد.

از مسیر مشخص‌شده برای جستجوی فایل‌های مبدأ در مسیر تعیین‌شده استفاده می‌کند. اگر این گزینه مشخص نشود، از مسیر پیش‌فرض نقطه (.) استفاده می‌شود.

اشکال‌زدا را با استفاده از سازوکار اتصال پیش‌فرض به یک JVM در حال اجرا متصل می‌کند.

منتظر می‌ماند تا یک JVM در حال اجرا با یک اتصال‌دهنده استاندارد به آدرس مشخص‌شده متصل شود.

برنامه تحت اشکال‌زدایی را بلافاصله پس از راه‌اندازی JDB اجرا می‌کند. گزینه -launch نیاز به استفاده از دستور run را برطرف می‌کند. برنامه تحت اشکال‌زدایی راه‌اندازی شده و دقیقاً پیش از بارگذاری کلاس اولیه برنامه متوقف می‌شود. در آن نقطه، می‌توانید هر نقطه توقف لازم را تنظیم کرده و با استفاده از دستور cont به اجرا ادامه دهید.

اتصال‌دهنده‌های موجود در این JVM را فهرست می‌کند.

با اتصال‌دهنده مشخص‌شده و مقادیر آرگومان‌های فهرست‌شده، به JVM هدف متصل می‌شود.

اطلاعاتی را برای اشکال‌زدایی دستور jdb چاپ می‌کند.

برنامه را در Java HotSpot VM client اجرا می‌کند.

برنامه را در Java HotSpot VM server اجرا می‌کند.

گزینه option را به JVM ارسال می‌کند، که در آن option یکی از گزینه‌های شرح داده شده در صفحه ارجاع راه‌انداز برنامه‌های جاوا است. برای مثال، -J-Xms48m مقدار حافظه آغازین را به 48 مگابایت تنظیم می‌کند. به java(1) مراجعه کنید.


حالت پرگو (verbose) را فعال می‌کند.

یک ویژگی سیستمی (system property) را تنظیم می‌کند.

دایرکتوری‌هایی را که باید برای یافتن کلاس‌ها در آن‌ها جستجو شود، به‌صورت جداشده با دونقطه (:) فهرست می‌کند.

گزینه غیراستاندارد JVM هدف.

•
javac(1)
•
java(1)
•
javap(1)
21 November 2013 JDK 8