هل يمكنني تعيين نقطة توقف على "الوصول إلى الذاكرة" في GDB؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أقوم بتشغيل تطبيق من خلال gdb وأريد تعيين نقطة توقف في أي وقت يتم فيه الوصول/تغيير متغير معين.هل هناك طريقة جيدة للقيام بذلك؟سأكون مهتمًا أيضًا بطرق أخرى لمراقبة متغير في C/C++ لمعرفة ما إذا كان يتغير أم لا.

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

المحلول

يشاهد فواصل فقط عند الكتابة، rwatch تتيح لك كسر القراءة، و ساعة تتيح لك التوقف عن القراءة/الكتابة.

يمكنك ضبط نقاط مراقبة القراءة على مواقع الذاكرة:

gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface

ولكن هناك قيد واحد ينطبق على أوامر rwatch وawatch؛لا يمكنك استخدام متغيرات GDB في التعبيرات:

gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.

لذلك عليك توسيعها بنفسك:

gdb$ print $ebx 
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f

Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()

يحرر: أوه، وبالمناسبة.أنت بحاجة إلى أي من الأجهزة أو دعم البرمجيات.من الواضح أن البرنامج أبطأ بكثير.لمعرفة ما إذا كان نظام التشغيل لديك يدعم نقاط مراقبة الأجهزة، يمكنك رؤية يمكن استخدام نقاط المراقبة إعداد البيئة.

gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.

نصائح أخرى

بافتراض أن الإجابة الأولى تشير إلى بناء الجملة المشابه لـ C (char *)(0x135700 +0xec1a04f) ثم الجواب للقيام به rwatch *0x135700+0xec1a04f غير صحيح.بناء الجملة الصحيح هو rwatch *(0x135700+0xec1a04f).

نقص، شح، قله ()لقد سبب لي قدرًا كبيرًا من الألم أثناء محاولتي استخدام نقاط المراقبة بنفسي.

ما تبحث عنه يسمى أ نقطة المراقبة.

الاستخدام

(gdb) watch foo:مشاهدة قيمة عامل foo

(gdb) watch *(int*)0x12345678:مشاهدة القيمة التي أشار إليها عنوان, ، مصبوبة إلى أي نوع تريد

(gdb) watch a*b + c/d:مشاهدة بشكل تعسفي تعبير معقد, ، صالحة باللغة الأصلية للبرنامج

نقاط المراقبة هي من ثلاثة أنواع:

  • يشاهد:سوف ينكسر gdb عندما يكون a يكتب يحدث
  • rwatch:سوف يكسر gdb wnen a يقرأ يحدث
  • ساعة:سوف يقتحم gdb في القضيتين

يمكنك اختيار أكثر ملاءمة لاحتياجاتك.

لمزيد من المعلومات، تحقق هذا خارج.

لقد حاولت للتو ما يلي:

 $ cat gdbtest.c
 int abc = 43;

 int main()
 {
   abc = 10;
 }
 $ gcc -g -o gdbtest gdbtest.c
 $ gdb gdbtest
 ...
 (gdb) watch abc
 Hardware watchpoint 1: abc
 (gdb) r
 Starting program: /home/mweerden/gdbtest 
 ...

 Old value = 43
 New value = 10
 main () at gdbtest.c:6
 6       }
 (gdb) quit

لذا يبدو الأمر ممكنًا، ولكن يبدو أنك بحاجة إلى بعض دعم الأجهزة.

استخدم watch لمعرفة متى تتم كتابة المتغير، وrwatch عندما تتم قراءته، وawatch عندما تتم قراءته/كتابته من/إلى، كما هو مذكور أعلاه.ومع ذلك، يرجى ملاحظة أنه لاستخدام هذا الأمر، يجب عليك كسر البرنامج، ويجب أن يكون المتغير في النطاق عند كسر البرنامج:

استخدم أمر المراقبة.الوسيطة إلى أمر الساعة هو تعبير يتم تقييمه.هذا يعني أن المتغير الذي تريد ضبط نقطة مراقبة يجب أن يكون في النطاق الحالي.لذلك ، لتعيين نقطة مراقبة على متغير غير عاقل ، يجب أن تكون قد وضعت نقطة توقف ستوقف البرنامج عندما يكون المتغير في النطاق.قمت بتعيين نقطة المراقبة بعد استراحة البرنامج.

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