আমি জানি যে মেমরিটি অ্যাক্সেস করতে এবং পড়তে আমরা বেশ কয়েকটি আদেশ ব্যবহার করতে পারি: উদাহরণস্বরূপ, মুদ্রণ, পি, এক্স ...
তবে আমি কীভাবে কোনও নির্দিষ্ট স্থানে (জিডিবিতে ডিবাগ করার সময়) মেমরির বিষয়বস্তুগুলি পরিবর্তন করতে পারি?
আমি জানি যে মেমরিটি অ্যাক্সেস করতে এবং পড়তে আমরা বেশ কয়েকটি আদেশ ব্যবহার করতে পারি: উদাহরণস্বরূপ, মুদ্রণ, পি, এক্স ...
তবে আমি কীভাবে কোনও নির্দিষ্ট স্থানে (জিডিবিতে ডিবাগ করার সময়) মেমরির বিষয়বস্তুগুলি পরিবর্তন করতে পারি?
উত্তর:
সবচেয়ে সহজ একটি প্রোগ্রামের ভেরিয়েবল নির্ধারণ করছে ( জিডিবি: অ্যাসাইনমেন্ট দেখুন ):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
অথবা আপনি ঠিকানার মাধ্যমে নির্বিচারে (লেখার যোগ্য) অবস্থান আপডেট করতে পারেন:
(gdb) set {int}0x83040 = 4
আরো আছে. ম্যানুয়াল পড়ুন ।
set (str[6]) = 'c'
কাজ করে, যদি আপনার কোনও অ্যারে থাকে, যেমনchar str[]
যেমন নিকোলাই বলেছে আপনি ভেরিয়েবলের মান পরিবর্তন করতে gdb 'set' কমান্ড ব্যবহার করতে পারেন।
মেমরির অবস্থানগুলি পরিবর্তন করতে আপনি 'সেট' কমান্ডও ব্যবহার করতে পারেন। যেমন নিকোলাইয়ের উদাহরণটি প্রসারিত:
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20
এটি যে কোনও বৈধ পয়েন্টারের জন্য কাজ করা উচিত এবং কোনও উপযুক্ত ডেটা টাইপে কাস্ট করা যেতে পারে।
set {char[100]}(0x00) = ""
0x00 ঠিকানায় 100 বাইটের মেমরি
এখানে সরবরাহ করা উত্তরগুলি প্রসারিত করা হচ্ছে।
আপনি কেবল set idx = 1
একটি ভেরিয়েবল সেট করতে করতে পারেন , তবে সেই বাক্য গঠনটি সুপারিশ করা হয় না কারণ ভেরিয়েবলের নামটি একটি সেট সাব-কমান্ডের সাথে সংঘর্ষে লিপ্ত হতে পারে। উদাহরণ হিসাবে set w=1
বৈধ হবে না।
এর অর্থ হল আপনার সিনট্যাক্সটি পছন্দ করা উচিত: set variable idx = 1
বা set var idx = 1
।
সর্বশেষে তবে সর্বনিম্ন নয়, আপনি কেবল আপনার বিশ্বাসযোগ্য পুরাতন মুদ্রণ কমান্ডটি ব্যবহার করতে পারেন, কারণ এটি কোনও অভিব্যক্তির মূল্যায়ন করে। পার্থক্যটি হ'ল তিনি প্রকাশের ফলাফলটিও মুদ্রণ করেন।
(gdb) p idx = 1
$1 = 1
আপনি এখানে জিডিবি সম্পর্কে আরও পড়তে পারেন ।