আমি কি জিডিবিতে 'মেমরি অ্যাক্সেস' সম্পর্কে একটি ব্রেকপয়েন্ট সেট করতে পারি?


244

আমি জিডিবি এর মাধ্যমে একটি অ্যাপ্লিকেশন চালাচ্ছি এবং আমি নির্দিষ্ট ভেরিয়েবল অ্যাক্সেস / পরিবর্তন হওয়া যে কোনও সময় ব্রেক ব্রেকপয়েন্ট সেট করতে চাই। এটি করার জন্য কি কোনও ভাল পদ্ধতি আছে? আমি / সি / সি ++ এর পরিবর্তনশীল নিরীক্ষণের অন্যান্য উপায়ে আগ্রহী / কখন এটি পরিবর্তন হয় তা দেখতে আগ্রহী।

উত্তর:


286

ঘড়ি শুধুমাত্র লেখার উপর বিরতি rwatch আপনি পড়তে বিরতি দিন, এবং awatch আপনি পঠন / লিখন বিরতি দিন।

আপনি মেমরির অবস্থানগুলিতে পঠিত ওয়াচপয়েন্টগুলি সেট করতে পারেন:

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

তবে একটি সীমাবদ্ধতা rwatch এবং আওয়াচ আদেশের জন্য প্রযোজ্য; আপনি 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 ()

সম্পাদনা: ওহ, এবং ওয়ে by আপনার হার্ডওয়ার বা সফ্টওয়্যার সমর্থন দরকার । সফ্টওয়্যার স্পষ্টতই অনেক ধীর। আপনার ওএস হার্ডওয়্যার ওয়াচপয়েন্টগুলি সমর্থন করে কিনা তা জানতে আপনি ব্যবহার করতে পারেন এইচডাব্লু-ওয়াচপয়েন্টস পরিবেশ সেটিংটি দেখতে পারেন

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

7
আপনি যদি একটি সি ++ পদ্ধতি সদস্য দেখতে চান তবে আমি এই বৈকল্পিক অত্যন্ত দরকারী পাওয়া যায়নি: watch -location mTextFormatted
ইভান ভুইসিকা

আমার যদি কোনও ভেরিয়েবলের ঠিকানা না থাকে তবে কী হবে? আমি কি কেবল এর নাম ব্যবহার করতে পারি?
রাফি খাতচাডোরিয়ান

5
আপনার জিডিবি অ্যাড্রেস-অফ অপারেটরের সাথে ভেরিয়েবলের ঠিকানা মুদ্রণ করতে পারেন। print &variable
লুডুভিজক

1
এই উত্তরটি কমান্ডগুলির দ্বারা দেখা মেমরির অবস্থানের আকার সম্পর্কে কিছুই বলে না watch। এদিকে, উপরেরটি পড়ার পরে এটি মুষ্টি প্রশ্নটি মনে পড়ে। কয়টি বাইট rwatch *0xfeedfaceআসলে দেখবে?
এএনটি

8
@ অ্যান্ট, আমি ধরে নিচ্ছিলাম এটি একটি একক বাইট দেখতে পাবে, যা এটির ক্ষেত্রে মনে হয় তবে আপনি এটি নির্দিষ্ট ধরণের করতে পারেন rwatch *(int *)0xfeedfaceএবং এটি sizeof(int)বাইটগুলি দেখতে পাবে : সোর্সওয়্যার.অর্গ.জি.জিডিবি
জিজ্ঞাসা করুন

28

আপনি যা খুঁজছেন তাকে একটি ওয়াচপয়েন্ট বলে

ব্যবহার

(gdb) watch foo: ভেরিয়েবলের মান দেখুন foo

(gdb) watch *(int*)0x12345678: আপনার ঠিকানাটি যা চান ঠিক তেমন কোনও ঠিকানা দ্বারা চিহ্নিত মানটি দেখুন

(gdb) watch a*b + c/d: প্রোগ্রামের মাতৃভাষায় বৈধ একটি নির্বিচারে জটিল অভিব্যক্তি দেখুন

ওয়াচপয়েন্টগুলি তিন ধরণের:

  • ঘড়ি : কোনও লিখন ঘটলে জিডিবি ভেঙে যাবে
  • rwatch : gdb ভাঙবে যখন একটি পঠন ঘটে occurs
  • অ্যাবাচ : জিডিবি উভয় ক্ষেত্রেই ব্রেক হবে

আপনি আপনার প্রয়োজনের জন্য আরও উপযুক্ত চয়ন করতে পারেন।

আরও তথ্যের জন্য, চেক এই বাইরে।


5
আমি অন্য উত্তরটি লিখেছি কারণ বিদ্যমানগুলি আমার কাছে খুব সোজা মনে হয়নি ...
পাওলো এম

25

ধরে নিচ্ছি প্রথম উত্তরটি সি-এর মতো সিনট্যাক্সের উল্লেখ করছে (char *)(0x135700 +0xec1a04f)তবে করার উত্তরটি rwatch *0x135700+0xec1a04fভুল। সঠিক বাক্য গঠন rwatch *(0x135700+0xec1a04f)

সেখানকার অভাব ()আমার নিজেকে ওয়াচপয়েন্টগুলি ব্যবহার করার চেষ্টা করার জন্য প্রচুর ব্যথার সৃষ্টি করেছে।


9

আমি কেবল নিম্নলিখিতটি চেষ্টা করেছি:

 $ 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

সুতরাং এটি সম্ভব বলে মনে হচ্ছে তবে আপনাকে কিছু হার্ডওয়্যার সমর্থন প্রয়োজন বলে মনে হচ্ছে।


যদি আপনার প্ল্যাটফর্মটি হার্ডওয়্যার ওয়াচপয়েন্টগুলিকে সমর্থন না করে তবে জিডিবি কোনও সফ্টওয়্যার ওয়াচ পয়েন্টে ফিরে আসবে।
টড

2

উপরের মত উল্লিখিত হিসাবে কোনও চলকটি কখন লেখা হয় তা rwatch এবং যখন পড়তে হয় / পাঠানো হয় তখন অ্যাচচ দেখুন watch তবে, দয়া করে নোট করুন যে এই কমান্ডটি ব্যবহার করার জন্য আপনাকে অবশ্যই প্রোগ্রামটি ভেঙে ফেলতে হবে এবং আপনি যখন প্রোগ্রামটি ভঙ্গ করেছেন তখন অবশ্যই ভেরিয়েবলের সুযোগ থাকতে হবে:

ওয়াচ কমান্ড ব্যবহার করুন। ওয়াচ কমান্ডের যুক্তিটি এমন একটি অভিব্যক্তি যা মূল্যায়ন করা হয়। এটি সূচিত করে যে আপনি যে ভেরিয়েবলটি একটি ওয়াচপয়েন্ট সেট করতে চান তা অবশ্যই বর্তমান স্কোপে। সুতরাং, একটি অ-গ্লোবাল ভেরিয়েবলের একটি ওয়াচপয়েন্ট সেট করতে, আপনার অবশ্যই একটি ব্রেকপয়েন্ট স্থাপন করতে হবে যা ভেরিয়েবলের সুযোগে থাকলে আপনার প্রোগ্রামটি থামিয়ে দেয়। আপনি প্রোগ্রাম বিরতি পরে ওয়াচপয়েন্ট সেট।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.