كيف يمكنني وضع نقطة توقف على "شيء تتم طباعة إلى محطة" في جدب؟

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

سؤال

وأود أن أعرف من أين داخل <م> ضخمة تتم طباعة تطبيق رسالة معينة. تطبيق كبيرة جدا والقديم أنه يستخدم كل السبل التي يمكن تصورها طباعة النص إلى المعبر. على سبيل المثال printf () fprintf (المعياري، ...) الخ.

وأنا أكتب لوضع نقطة توقف على استدعاء نظام الكتابة () ولكن بعد ذلك أنا غمرت مع عدد كبير جدا من نقطة توقف بسبب ملف مختلف I / O العمليات التي تستخدم الكتابة () كذلك.

وذلك أساسا أريد جدب إلى وقف كلما يطبع البرنامج شيئا للمحطة ولكن في نفس الوقت لا أريد جدب لوقف عندما يكتب البرنامج شيء إلى ملف.

هل كانت مفيدة؟

المحلول

استخدم نقطة توقف الشرطي أن يتحقق المعلمة الأولى. على أنظمة 64 بت إلى x86 الحالة ستكون كما يلي:

و(جدب) ب الكتابة إذا 1 == $ RDI

في أنظمة 32 بت، بل هو أكثر تعقيدا لأن المعلمة على المكدس، وهذا يعني أن عليك أن يلقي $ إسبانيا إلى int * ومؤشر المعلمة FD. مكدس في تلك المرحلة لديه عنوان المرسل، وطول، وأخيرا العازلة فد.

وهذا يختلف اختلافا كبيرا بين منصات الأجهزة.

نصائح أخرى

ومع جدب 7.0، يمكنك تعيين نقطة مشروطة syscall الكتابة ():

(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1

و$ EBX يحتوي على المعلمة syscall الأولى - عدد FD هنا

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