كيف يمكنك بدء تشغيل البرنامج مرة أخرى في gdb مع 'الهدف البعيد'?
سؤال
عندما كنت تفعل المعتاد gdb الدورة على ملف قابل للتنفيذ على نفس الكمبيوتر ، يمكنك إعطاء الأمر "تشغيل" وأنه سيتم بدء تشغيل البرنامج مرة أخرى.
عندما كنت تشغل gdb على نظام مضمن مع الأوامر الهدف localhost:3210', كيف يمكنك بدء تشغيل البرنامج مرة أخرى دون إنهاء وإعادة تشغيل الخاص بك gdb ؟
المحلول
كنت تبحث عن عملية متعددة وضع gdbserver و set remote exec-file filename
نصائح أخرى
للأسف لا أعرف طريقة تشغيل التطبيق و لا تزال تحافظ على الدورة الخاصة بك.الحل هو وضع جهاز الكمبيوتر مرة أخرى إلى نقطة الدخول من البرنامج الخاص بك.يمكنك القيام بذلك إما عن طريق الدعوة:
jump وظيفة
أو
set $pc=عنوان
.
إذا كنت munged الحجج main
قد تحتاج مجموعة منهم مرة أخرى.
تحرير:
وهناك زوجين من المحاذير مع الأسلوب أعلاه يمكن أن يسبب مشاكل.
- إذا كنت في برنامج متعدد الخيوط القفز الرئيسي سوف تقفز الترابط الحالي الرئيسية ، كل المواضيع الأخرى لا تزال قائمة.إذا كان مؤشر الترابط الحالي عقد قفل...ثم لديك بعض المشاكل.
- تسرب الذاكرة ، إذا كنت تدفق البرنامج يخصص بعض الأشياء أثناء التهيئة ثم انك تسربت مجموعة من الذاكرة مع القفز.
- فتح الملفات لا تزال مفتوحة.إذا كنت mmap بعض الملفات أو خطاب الدعوة من المرجح أن تفشل.
وذلك باستخدام القفزة ليست نفس الشيء مثل إعادة تشغيل البرنامج.
ويفترض أن تقوم بتشغيل gdbserver على جزءا لا يتجزأ من النظام.
يمكنك أن تطلب إلى إعادة تشغيل البرنامج الخاص بك بدلا من الخروج مع الهدف الممتد البعيد
"القفز _start" هي الطريقة المعتادة.
بالنسبة لي الطريقة الموضحة في 21.2 عينة GDB الدورة بدء التشغيل يعمل كبيرة.عندما كنت أدخل monitor reset halt
في وقت لاحق في "(gdb)" موجه الهدف الأجهزة هو إعادة تعيين ثم إعادة تشغيل التطبيق مع c
(= تواصل).
على load
الأمر يمكن حذفها بين أشواط لأن هناك حاجة إلى فلاش البرنامج مرة أخرى و مرة أخرى.
خطوة بخطوة الإجراءات
جهاز التحكم عن بعد:
# pwd contains cross-compiled ./myexec
gdbserver --multi :1234
المحلية:
# pwd also contains the same cross-compiled ./myexec
gdb -ex 'target extended-remote 192.168.0.1:1234' \
-ex 'set remote exec-file ./myexec' \
--args ./myexec arg1 arg2
(gdb) r
[Inferior 1 (process 1234) exited normally]
(gdb) r
[Inferior 1 (process 1235) exited normally]
(gdb) monitor exit
اختبار في أوبونتو 14.04.
فمن الممكن أيضا أن تمر CLI الحجج البرنامج:
gdbserver --multi :1234 ./myexec arg1 arg2
و ./myexec
جزء يزيل الحاجة إلى set remote exec-file ./myexec
, ولكن هذا بعد مضايقات:
- غير الموثقة: https://sourceware.org/bugzilla/show_bug.cgi?id=21981
- لا تظهر على
show args
و لا تستمر عبر تشغيل: https://sourceware.org/bugzilla/show_bug.cgi?id=21980
تمرير متغيرات البيئة و تغيير دليل العمل دون إعادة تشغيل: كيفية تعديل متغيرات البيئة و دليل العمل من gdbserver --متعددة دون إعادة تشغيل ؟
إذا كنت تقوم بتشغيل العادية gdb يمكنك كتابة 'تشغيل' اختصار 'r' و جدب يسألك إذا كنت ترغب في تشغيل البرنامج
على EFM32 سعيد أبو بريص أي من هذه الاقتراحات سوف يعمل بالنسبة لي, حتى هنا هو ما تعلمته من الوثائق على دمج GDB في الكسوف البيئة.
(gdb) mon reset 0
(gdb) continue
(gdb) continue
هذا يضعني في الدولة التي كنت أتوقع عندما ضرب الضبط من IDE.