كتابة الاختبارات التي تستخدم GDB - كيفية التقاط الإخراج؟

StackOverflow https://stackoverflow.com/questions/2321087

  •  22-09-2019
  •  | 
  •  

سؤال

أحاول كتابة اختبارات تتفاعل مع GDB لكنني أواجه مشكلة في التقاط الإخراج. أرغب في إنشاء ملف سجل يبدو أنه ما كان يمكن رؤيته في محطة لو تم تنفيذ الاختبار باليد. يثبت GDB أنه عنيد للغاية عندما يتعلق الأمر بالتقاط إنتاجه.

لقد تمكنت من كتابة البرامج النصية المتوقعة التي يمكن أن تتفاعل مع GDB والتي يمكن إعادة توجيه إخراجها إلى ملف السجل ولكني لا أريد كتابة اختباراتي في TCL. آمل أن أستخدم Groovy ، وهو متوافق مع Java. لسبب ما مع توقع Perl وتوقع أن ينتقل إخراج البرنامج دائمًا إلى المحطة ولا يمكن إعادة توجيهه إلى ملف.

لقد حاولت بدء عملية GDB من Java باستخدام ProcessBuilder وهي تعمل في الغالب ، لكن إخراج عبارات الطباعة لا يظهر أبدًا على stdout ولا يمكن التقاطه. اعتقدت أنه إذا توقعت الأعمال ، فأنا أتوقع من Java وجعلها تتفاعل مع GDB ولكن في هذه الحالة يتم فقد معظم إخراج البرنامج ، ولم يظهر أبدًا في stdout من العملية التي تم إنشاؤها.

لذا فإن سؤالي هو ، كيف يمكنني كتابة اختبار في Groovy (سيكون Java على ما يرام أيضًا) الذي يتفاعل مع GDB ويمكنه التقاط جميع الإخراج؟

كود مزيف:

process = "gdb -q".execute()
waitForPrompt()
send("file exec")
waitForPrompt()
send("run")
send("quit")

ملف تسجيل:

(gdb) file exec
Reading symbols from exec...done.
(gdb) run
Starting program: exec
<... output ...>

Program exited normally.
(gdb) quit
هل كانت مفيدة؟

المحلول

أحد الاحتمالات هو أن إخراج GDB يتم إلقاؤه على خطأ قياسي وأنك لا تلتقط سوى الإخراج القياسي. يجب أن تكون قادرًا على إصلاح هذا بإعادة توجيه ، شيء مثل هذا أعتقد:

 process = "gdb -q 2&>1".execute()

التخمين الثاني هو أنه قد يكون من المفيد التحقق مما يقوله "عرض الوضع التفاعلي" في الحالات العاملة وغير العمل. إذا اختلفوا ، فحاول "تعيين وضع تفاعلي" قبل أن تفعل أي شيء آخر.

يتمثل الخيار الثالث في استخدام منشأة تسجيل GDB لكتابة ملف السجل ("تعيين ملف التسجيل" و "تعيين تسجيل الدخول") وتجنب الاضطرار إلى التقاط الإخراج بنفسك.

نصائح أخرى

إذا كان الاختبار الخاص بك يتضمن استخدام GDB لتصحيح شيء ما ، بدلاً من اختبار GDB نفسه ، فيجب أن تبحث في استخدام واجهة GDB/MI.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top