কোর ডিম্পের পাশাপাশি এক্সিকিউটেবলেরও কেন জিডিবি দরকার?


11

আমি কোর ডাম্পগুলি ব্যবহার করে ডিবাগ করছি এবং নোট করুন যে জিডিবি আপনাকে এক্সিকিউটেবলের পাশাপাশি কোর ডাম্প সরবরাহ করতে হবে। কেন? যদি কোর ডাম্পটিতে প্রক্রিয়াটি ব্যবহার করে এমন সমস্ত মেমরি থাকে তবে মূল ডাম্পের মধ্যে কি এক্সিকিউটেবল থাকে না? সম্ভবত কোনও গ্যারান্টি নেই যে পুরো এক্সি মেমরিতে লোড হয়েছে (স্বতন্ত্র এক্সিকিউটেবল সাধারণত যদিও এত বড় হয় না) বা সম্ভবত কোর ডাম্পের পরে সমস্ত প্রাসঙ্গিক মেমরি থাকে না? এটি কি প্রতীকগুলির জন্য (সম্ভবত এগুলি সাধারণত স্মৃতিতে লোড হয় না)?


1
এক্সিকিউটেবলের মধ্যে জিডিবি ডকুমেন্টেশনে উল্লিখিত হিসাবে প্রতীক তথ্য রয়েছে ...
থমাস ডিকি

1
আশ্চর্যের বিষয় হল, কোনও উত্তর (কেবলমাত্র আমি যুক্ত হওয়া ব্যতীত) DWARF ফর্ম্যাটটির উল্লেখ করে না
বেসাইল স্টারিঙ্কেভিচ

উত্তর:


15

মূল ডাম্পটি আপনার প্রোগ্রামগুলির মেমরির পদক্ষেপের ডাম্প মাত্র, যদি আপনি জানতেন যে যেখানে সবকিছু ছিল তখন আপনি কেবল এটি ব্যবহার করতে পারেন।

আপনি এক্সিকিউটেবলটি ব্যবহার করেন কারণ এটি ব্যাখ্যা করে যেখানে (লজিকাল ঠিকানার শর্তে) জিনিসগুলি মেমরিতে অবস্থিত, অর্থাত্ মূল ফাইল।

আপনি যদি কোনও কমান্ড ব্যবহার করেন তবে objdumpএটি কার্যকর করা যায় এমন বস্তুর সম্পর্কে মেটা ডেটা ডাম্প করবে you উদাহরণ হিসাবে a.out নামে একটি এক্সিকিউটেবল অবজেক্ট ব্যবহার করা।

objdump -h a.outকেবল শিরোনামের তথ্য ডাম্প করে, আপনি উদাহরণস্বরূপ বিভাগগুলি দেখতে পাবেন। .ডাটা বা .বিএস বা টেক্সট (আরও অনেক কিছু আছে)। এগুলি কার্নেল লোডারকে অবহিত করে যেখানে বস্তুটিতে বিভিন্ন বিভাগ পাওয়া যাবে এবং প্রক্রিয়া ঠিকানার জায়গাতে বিভাগটি লোড করা উচিত এবং কিছু বিভাগের জন্য (যেমন .ডাটা। পাঠ্য) কী লোড করা উচিত। (.bss বিভাগে ফাইলটিতে কোনও ডেটা থাকে না তবে এটি অবিবেচনাযুক্ত ডেটা প্রক্রিয়ায় সংরক্ষণের জন্য মেমরির পরিমাণকে বোঝায়, এটি জিরো দিয়ে পূর্ণ)।

এক্সিকিউটেবল অবজেক্ট ফাইলের বিন্যাসটি একটি স্ট্যান্ডার্ড, ইএলএফ এর সাথে সামঞ্জস্য করে।

objdump -x a.out - সবকিছু ফেলে দেয়

যদি এক্সিকিউটেবল অবজেক্টটিতে এখনও তার চিহ্ন সারণী থাকে (এটি ছিনিয়ে নেওয়া হয়নি - man stripএবং আপনি এসি উত্স সংকলন ধরে -gডিবাগ প্রজন্ম তৈরি করেছিলেন gcc) তবে আপনি মূল বিষয়বস্তুগুলি চিহ্নের দ্বারা পরীক্ষা করতে পারেন, উদাহরণস্বরূপ যদি আপনার কোনও চলক / বাফার থাকে আপনার উত্স কোডে নাম দেওয়া ইনপুটলাইন , আপনি gdbএটির সামগ্রীটি দেখতে সেই নামটি ব্যবহার করতে পারেন । অর্থাত্ gdbআপনার প্রোগ্রামগুলির সূচনা থেকে অফসেটটি জানা থাকবে ডেটা বিভাগ যেখানে ইনপুটলাইন শুরু হয় এবং সেই পরিবর্তনশীলটির দৈর্ঘ্য।

আরও পড়ুন Article1 , ধারা 2 , এবং উকুনসম্পন্ন বালুকাময় জন্য সম্পাদনযোগ্য এবং লিঙ্ক ফরম্যাট (ELF) স্পেসিফিকেশন


নীচে @ মিরাবিলোসের মন্তব্যের পরে আপডেট করুন।

তবে প্রতীক টেবিলটি হিসাবে ব্যবহার করা হয়

$ gdb --batch -s a.out -c core -q -ex "x buf1"

উত্পাদন

 0x601060 <buf1>:    0x72617453

এবং তারপরে প্রতীক টেবিল ব্যবহার না করা এবং সরাসরি ঠিকানা পরীক্ষা করা,

$ gdb --batch -c core -q -ex "x 0x601060"

উত্পাদন

0x601060:   0x72617453

আমি দ্বিতীয় কমান্ডের প্রতীক টেবিলটি ব্যবহার না করে সরাসরি মেমরি পরীক্ষা করেছি।


আমি আরও দেখছি, @ ব্যবহারকারীর ৮৮০০৮২ এর উত্তর ব্যাখ্যাটিতে আরও যোগ করেছে এবং ভোট দেবে।


6
"বেসিক স্ট্যাক বিভাগ" সম্পর্কে কখনও শুনিনি। .bss হ'ল ( icallyতিহাসিকভাবে ) "প্রতীক দ্বারা ব্লক শুরু হয়েছে" এবং ব্যবহারিকভাবে "ইউনিটিয়ালাইজড ডেটা", যখন .ডাটা " আরম্ভিত ডেটা" এবং পাঠ্য (। কোড নয়) মেশিন কোড সঞ্চয় করতে ব্যবহৃত হয়। বাইনারিটিতে কোনও স্ট্যাক বিভাগ নেই, কারণ রানার সময় স্ট্যাকগুলি তৈরি করা হয়।
jlliagre

"আপনি যদি জানেন যে সমস্ত কিছু তখন আপনি কেবল এটি ব্যবহার করতে পারেন" হয় না হয় সত্য কারণ প্রোগ্রামটির প্রতিটি জিনিসই অবশ্যই পদচিহ্নের অন্তর্ভুক্ত নয়।
মিরাবিলোস

1
@ জেলিয়াগ্রে আপনি ঠিক বলেছেন, আমি ভুল করে .text .code কল করেছি (কারণ আমি উত্তরটি রচনা করার সময় একটি ব্যাখ্যা ভাবছিলাম) - আপডেট হয়েছে। আমি ভুল করে নাম দ্বারা বসের কথা ভেবে ভুল করেছি, এবং আমার উত্তর আপডেট করেছি, তবে * প্রতীক দ্বারা শুরু করা ব্লক এড়িয়ে গেছি যেহেতু আমি মনে করি না যে এটি সত্যিই এই সমীকরণকে যুক্ত করেছে, এবং ব্যাখ্যা করেছি যে এটি অ-আরম্ভিত ডেটা হিসাবে ব্যবহৃত হয়েছিল, যা আমাদের ছিল সাধারণ বোঝাপড়া আপনাকে ধন্যবাদ - এই পোস্টিংটি সংশোধন করার জন্য আমি আপনার মন্তব্যের প্রশংসা করেছি।
এক্স টিয়ান

4

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

আপনার প্রশ্নে , জিডিবি এক্সিকিউটেবলের প্রয়োজনীয়তার কারণ হ'ল ভ্লগ্রাইন্ডের মতো বাইনারি নির্দেশাবলী পড়ে বা ব্যাখ্যার মাধ্যমে এটি প্রয়োগের অনুকরণ করে না, পরিবর্তে প্রক্রিয়াটির আচরণকে নিয়ন্ত্রণ করার জন্য এটি প্রক্রিয়ার পিতা-মাতার হয়ে ওঠে does সময়। ক্রাশের সময় মেমরি ম্যাপিং এবং প্রসেসরের প্রক্রিয়া প্রক্রিয়া স্থিত করতে এটি মূল ফাইলটি ব্যবহার করে।

লিনাক্সে প্যারেন্ট প্রসেসগুলি তাদের বাচ্চাদের সম্পর্কে অতিরিক্ত তথ্য পেতে পারে, বিশেষত তাদের প্যাট্রিস করার ক্ষমতা যা ডিবাগারটিকে প্রক্রিয়াটির নিম্ন স্তরের তথ্য অ্যাক্সেসের অনুমতি দেয় যেমন মেমরি পড়তে / লিখতে, রেজিস্টার করতে, সিগন্যাল ম্যাপিংগুলি পরিবর্তন করতে, এর প্রয়োগ বন্ধ করে দেয় ইত্যাদি etc.

কোনও ডিবাগার কীভাবে কাজ করে তা আপনি একবার পড়লে কোর ফাইল থাকার পরেও এক্সিকিউটেবল ইনস্পাইটের প্রয়োজনীয়তা বুঝতে পারবেন।


1

(অন্যান্য ভাল উত্তর ছাড়াও)

আধুনিক লিনাক্স (এবং অনেকগুলি ইউনিক্সের মতো) সিস্টেমে, ডিবাগিংয়ের তথ্য (প্রতীকের ধরণের সম্পর্কিত উত্স, উত্স কোডের অবস্থান, ভেরিয়েবলের প্রকার ইত্যাদি ইত্যাদি) মেটা-ডেটা DWARF ফর্ম্যাটে রয়েছে এবং ELF এক্সিকিউটেবলের ভিতরে বসে ( বা ইএলএফ শেয়ার করা লাইব্রেরিগুলি) যখন এটি কোনও -gবিকল্পের সাথে সংকলিত হয় । আমি কম্পাইলিং প্রোগ্রামগুলির সাথে ডিবাগ করার পরামর্শ দিচ্ছি -g3 -O0এবং সম্ভবত -fno-inlineসাম্প্রতিক কোনও জিসিসি ব্যবহার করা থাকলে ; তবে, জিসিসির সাহায্যে আপনি অপ্টিমাইজেশন এবং ডিবাগিং তথ্য উভয়ই সংকলন করতে পারেন, উদাহরণস্বরূপ -O2 -g1, যদিও ডিবাগ তথ্য সেই ক্ষেত্রে কিছুটা " ফাসি " হতে পারে (এটি কিছু দুষ্টু হেইসেনবगগুলি ধরতে সামান্য সহায়তা করতে পারে )।

এই তথ্যটি মূল ফাইলগুলিতে স্থাপন করা এড়াতে যথেষ্ট বুদ্ধিমানের কারণ আপনার coreএকই রকম এক্সিকিউটেবলের জন্য অনেকগুলি মূল কোর ফাইল থাকতে পারে (বহু ব্যবহারকারী বাগ রিপোর্ট তৈরি করে এমন একটি বহুল ব্যবহৃত সফ্টওয়্যার কল্পনা করুন )। এছাড়াও কোর (5) ফাইলগুলি কার্নেল দ্বারা ডাম্প করা হয়, যা এলিফ (5) এক্সিকিউটেবলগুলিতে DWARF বিভাগগুলির অস্তিত্বের বিষয়ে চিন্তা করে না (কারণ এই বিভাগগুলি ফল্টিং প্রক্রিয়াটির ভার্চুয়াল অ্যাড্রেস স্পেসে ম্যাপ করা হয়নি যা কিছু সংকেতের উপর কোর ফেলে দেয় ( 7) )। এমনকি ডিবাগের তথ্য পৃথক পৃথক ফাইলের (এক্সিকিউটেবলের বাইরে) রাখারও সম্ভাবনা রয়েছে।

বিটিডাব্লু, জিডিবি কোনও ডিবাগ তথ্য ছাড়াই এক্সিকিউটেবলের জন্য কোর ডাম্পগুলি ডিবাগ করার জন্য বেদনাদায়কভাবে ব্যবহার করা যেতে পারে । তবে তারপরে আপনি কার্যত মেশিন কোড পর্যায়ে ডিবাগ করেন (প্রোগ্রামিং ভাষা এবং তাদের সংকলকগুলির দ্বারা প্রদত্ত প্রতীকী স্তরে নয়)।

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