vgdb - واسط
میان Valgrind و GDB یا
پوسته
vgdb («Valgrind to GDB»)
بهعنوان
یک واسط
میان Valgrind و GDB یا
یک پوسته (شل)
استفاده
میشود. این
ابزار
دارای سه
حالت
استفاده
است:
1.بهعنوان
یک ابزار
مستقل، از
خط فرمان
پوسته برای
ارسال
دستورات
پایش (monitor) به
فرایندی که
تحت Valgrind اجرا
میشود به
کار میرود.
برای این
کاربرد، پس
از
گزینه(های) vgdb
باید دستور
پایش مورد
نظر جهت
ارسال قرار
گیرد. برای
ارسال بیش
از یک
دستور،
آنها را با
گزینه -c از
یکدیگر جدا
کنید.
2.در
ترکیب با
دستور «target remote |»
در GDB،
بهعنوان
برنامه
بازپخش (relay)
میان GDB و Valgrind gdbserver
استفاده
میشود.
برای این
حالت
استفاده،
فقط
گزینه(ها)
مجاز هستند
و هیچ
دستوری
نباید داده
شود.
3.در حالت
--multi ، vgdb از
پروتکل
توسعهیافته
ریموت (extended remote protocol)
برای
برقراری
ارتباط با GDB
استفاده
میکند. این
ویژگی به
شما امکان
میدهد
خروجیهای
هر دو
برنامه valgrind و GDB
را در نشست GDB
مشاهده
کنید. این
کار از طریق
دستور «target extended-remote | vgdb
--multi» میسر
میشود. در
این حالت
دیگر نیازی
به اجرای
دستی valgrind توسط
خودتان
نیست؛ vgdb به
محض اینکه gdb
دستور
اجرای
برنامه
جدید را
بدهد، valgrind را
راهاندازی
میکند.
برای این
حالت
استفاده،
گزینههای vgdb
همچنین
میتوانند
شامل --valgrind و --vargs
باشند تا
چگونگی
راهاندازی
valgrind را توصیف
کنند.
--pid=<number>
شناسه
فرایند (PID)
فرایندی را
که vgdb باید به
آن متصل شود
مشخص
میکند. این
گزینه در
شرایطی
مفید است که
بیش از یک Valgrind gdbserver
برای اتصال
در دسترس
باشد. اگر
آرگومان --pid
داده نشود و
چندین
فرایند Valgrind gdbserver
در حال اجرا
باشند، vgdb
فهرست چنین
فرایندهایی
را گزارش
کرده و سپس
خارج
میشود.
--vgdb-prefix
اگر
میخواهید
پیشوند
پیشفرض FIFOها
(لولههای
نامگذاریشده)
مورد
استفاده
برای
ارتباط
میان Valgrind gdbserver و vgdb
را تغییر
دهید، باید
این گزینه
را هم به Valgrind و
هم به vgdb
بدهید.
--wait=<number>
به vgdb
دستور
میدهد به
مدت تعداد
ثانیههای
تعیینشده
به دنبال Valgrind
gdbserverهای در
دسترس
بگردد. این
ویژگی
امکان
اجرای
فرایند vgdb را
پیش از
راهاندازی
Valgrind gdbserver مورد
نظری که قصد
ارتباط با
آن را دارید
فراهم
میسازد.
این گزینه
در صورت
استفاده
همراه با یک
--vgdb-prefix یکتا
برای
فرایندی که
میخواهید
منتظر آن
بمانید
بسیار
سودمند است.
همچنین اگر
از آرگومان
--wait در دستور
«target remote» در GDB
استفاده
میکنید،
باید remotetimeout را
در GDB به
مقداری
بزرگتر از
مقدار
آرگومان --wait
تنظیم کنید.
برای مثالی
از تنظیم
مقدار remotetimeout،
گزینه --max-invoke-ms
(در ادامه) را
ببینید.
--max-invoke-ms=<number>
تعداد
میلیثانیههایی
را مشخص
میکند که
پس از آن vgdb
فراخوانی gdbserver
تعبیهشده
در Valgrind را
اجباری
میکند.
مقدار
پیشفرض
۱۰۰
میلیثانیه
است. مقدار ۰
فراخوانی
اجباری را
غیرفعال
میکند.
فراخوانی
اجباری
زمانی به
کار میرود
که vgdb به یک Valgrind gdbserver
متصل باشد و
تمام
ریسههای (threads)
فرایند Valgrind در
یک
فراخوانی
سیستمی (system call)
مسدود (blocked) شده
باشند.
اگر مقدار
بزرگی
تعیین
کنید، ممکن
است لازم
باشد مقدار
«remotetimeout» را در GDB
از مقدار
پیشفرض ۲
ثانیه
افزایش
دهید. باید
مطمئن شوید
که مهلت
زمانی
(برحسب
ثانیه) از
مقدار --max-invoke-ms
بزرگتر
باشد. برای
مثال، برای
--max-invoke-ms=5000، دستور
زیر در GDB
مناسب است:
(gdb) set remotetimeout 6
--cmd-time-out=<number>
به یک vgdb
مستقل
دستور
میدهد در
صورتی که Valgrind gdbserver
متصلشده
دستوری را
در تعداد
ثانیههای
مشخصشده
پردازش
نکند، خارج
شود. مقدار
پیشفرض
این است که
هرگز منقضی
نشود.
--port=<portnr>
به vgdb
دستور
میدهد
بهجای
استفاده از
پایپ برای
برقراری
ارتباط با GDB،
از پروتکل tcp/ip
استفاده
کرده و روی
شماره پورت
مشخصشده
منتظر GDB
بماند.
استفاده از
tcp/ip امکان
اجرای GDB روی
یک رایانه و
اشکالزدایی
فرایند Valgrind در
حال اجرا
روی یک
رایانه
مقصد دیگر
را فراهم
میکند.
مثال:
# در رایانه مقصد، برنامه خود را تحت valgrind اجرا کنید با:
valgrind --vgdb-error=0 prog
# و سپس در یک پوسته دیگر، اجرا کنید:
vgdb --port=1234
در
رایانهای
که میزبان GDB
است، این
دستور را
اجرا کنید:
gdb prog
(gdb) target remote targetip:1234
که در آن targetip
آدرس IP یا
نام میزبان
رایانه
مقصد است.
--vgdb-multi
باعث
میشود vgdb در
حالت extended-remote
آغاز شده و
منتظر
بماند تا gdb
برنامه
اجرایی را
مشخص کند.
--valgrind
مسیر
باینری valgrind
جهت
استفاده در
حالت extended-remote. در
صورت عدم
تعیین،
نسخه valgrind
سیستمی
راهاندازی
خواهد شد.
--vargs
گزینههای
اجرای valgrind در
حالت extended-remote؛
بهعنوان
مثال -q. هر
آنچه پس از
--vargs بیاید،
عیناً
بهعنوان
آرگومان به
valgrind ارسال
میشود.
-c
برای
ارسال بیش
از یک دستور
به vgdb مستقل،
دستورات را
با گزینه
-c
از یکدیگر
جدا کنید.
مثال:
vgdb v.set log_output -c leak_check any
-l
به یک vgdb
مستقل
دستور
میدهد
فهرست
فرایندهای
در حال
اجرای Valgrind gdbserver را
گزارش کرده
و سپس خارج
شود.
-T
به vgdb
دستور
میدهد به
پیامهای
اطلاعاتی vgdb
برچسب زمان
(timestamp) بیفزاید.
-D
به یک vgdb
مستقل
دستور
میدهد
وضعیت
حافظه
اشتراکی
استفادهشده
توسط Valgrind gdbserver را
نمایش دهد. vgdb
پس از نمایش
وضعیت
حافظه
اشتراکی Valgrind gdbserver
خارج خواهد
شد.
-d
به vgdb
دستور
میدهد
خروجی
اشکالزدایی
تولید کند.
برای
افزایش
جزئیات
خروجی، چند
بار
آرگومان -d
را وارد
کنید. هنگام
ارسال -d به
یک vgdb بازپخش
(relay)، بهتر است
خروجی خطای
استاندارد
(stderr) مربوط به vgdb
را به یک
فایل تغییر
مسیر (redirect) دهید
تا از تداخل
میان خروجی
اشکالزدایی
vgdb و GDB جلوگیری
شود.
- 1.
- Debugging your program using Valgrind's gdbserver and GDB
- 2.
- vgdb
- 3.
- Valgrind monitor commands