একটি ডিবাগার কীভাবে কাজ করে?


170

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



@ অক্টালিস্ট এই নিবন্ধটি আকর্ষণীয় তবে লিনাক্সে ডিবাগিংয়ের জন্য কেবলমাত্র API- স্তরের বিমূর্ততা সম্পর্কে আলোচনা করে talks আমার ধারণা ওপি হুডের নীচে আরও জানতে চায়।
স্মিভিকিপিডিয়া

উত্তর:


96

কোনও ডিবাগার কীভাবে কাজ করে তার বিশদটি আপনি কী ডিবাগ করছেন এবং ওএস কী তা নির্ভর করে। উইন্ডোজে নেটিভ ডিবাগিংয়ের জন্য আপনি এমএসডিএন: উইন 32 ডিবাগিং এপিআই- তে কিছু বিশদ জানতে পারেন

নাম বা প্রক্রিয়া আইডি দ্বারা কোনও প্রক্রিয়াটি সংযুক্ত করার জন্য ব্যবহারকারী ডিবাগারকে বলে। যদি এটি একটি নাম হয় তবে ডিবাগারটি প্রসেস আইডি সন্ধান করবে এবং একটি সিস্টেম কলের মাধ্যমে ডিবাগ সেশন শুরু করবে; উইন্ডোজ অধীনে এটি ডিবাগএকটিভপ্রসেস হবে

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

ডিবাগার লক্ষ্য প্রক্রিয়াটির ভার্চুয়াল মেমরিটি পড়তে এবং লিখতে সক্ষম হয় এবং এমনকি OS এর সরবরাহিত এপিআইয়ের মাধ্যমে এর নিবন্ধকের মানগুলি সামঞ্জস্য করে। উইন্ডোজের ডিবাগিং ফাংশনগুলির তালিকা দেখুন ।

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

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


5
এই প্রশ্নটি বোকা লাগতে পারে তবে প্রোগ্রামের ভিতরে কোনও নির্দিষ্ট ঠিকানা পৌঁছে গেলে ওএস কীভাবে ট্র্যাক রাখে। উদাহরণস্বরূপ একটি ব্রেক ব্রেকপয়েন্ট 0x7710 Cafe ঠিকানায় সেট করা আছে। নির্দেশ পয়েন্টারটি ওএস পরিবর্তন করার সাথে সাথে (বা সিপিইউ) সমস্ত ব্রেক পয়েন্ট অ্যাড্রেসগুলির সাথে নির্দেশ পয়েন্টারটির তুলনা করতে হবে, বা আমি ভুল করছি? কিভাবে কাজ করে ..?
displayname

3
@ স্টেফানফালক আমি একটি উত্তর লিখেছি যা নিম্ন স্তরের কিছু বিশদ সম্বোধন করে (x86 এ)।
জোনাথন রাইনহার্ট

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

@ জামেস জোশুয়া স্ট্রিট আমি কল্পনা করব যে এটি একটি বিবরণ যা ডিবাগারের জন্য নির্দিষ্ট।
moonman239

এই উত্তরটি কিছু প্রকাশ করে। তবে আমার কাছে মনে হয় অপটি কিছু এপিআই বিমূর্তির চেয়ে কিছু নিম্ন স্তরের বিশদগুলিতে বেশি আগ্রহী।
স্মিভিকিপিডিয়া

63

আমি এটি বুঝতে হিসাবে:

X86 এ সফ্টওয়্যার ব্রেকপয়েন্টগুলির জন্য, ডিবাগারটি নির্দেশের প্রথম বাইটটি CC( int3) দিয়ে প্রতিস্থাপন করে । এটি WriteProcessMemoryউইন্ডোজ দিয়ে করা হয়। সিপিইউ যখন সেই নির্দেশ পেয়ে যায় এবং কার্যকর করেint3 , এর ফলে সিপিইউ একটি ডিবাগ ব্যতিক্রম উত্পন্ন করে। ওএস এই বাধাপ্রাপ্ত হয়, উপলব্ধি করে যে প্রক্রিয়াটি ডিবাগ হচ্ছে, এবং ডিবাগার প্রক্রিয়াটি ব্রেকপয়েন্টে আঘাত হানে তা জানিয়ে দেয়।

ব্রেকপয়েন্টে আঘাত হানার পরে এবং প্রক্রিয়াটি বন্ধ হয়ে যাওয়ার পরে, ডিবাগারটি তার ব্রেকপয়েন্টগুলির তালিকায় নজর রাখে এবং CCসেখানে যে বাইটটি সেখানে ছিল তা প্রতিস্থাপন করে । ডিবাগার সেট করে TF, ট্র্যাপ ফ্ল্যাগ ইন EFLAGS(পরিবর্তন করে CONTEXT) এবং প্রক্রিয়াটি চালিয়ে যায়। ট্র্যাপ ফ্ল্যাগের ফলে সিপিইউ স্বয়ংক্রিয়ভাবে একক-পদক্ষেপ ব্যতিক্রম তৈরি করে (INT 1 পরবর্তী নির্দেশে ) করে।

প্রক্রিয়াটি যখন ডিবাগ করা পরবর্তী সময় বন্ধ হয়ে যায়, তখন ডিবাগার আবার ব্রেক ব্রেকপয়েন্ট নির্দেশের প্রথম বাইটের সাথে প্রতিস্থাপন করে CC এবং প্রক্রিয়াটি অব্যাহত থাকে।

আমি নিশ্চিত না যে এটি ঠিক একইভাবে এটি সমস্ত ডিবাগার দ্বারা বাস্তবায়িত হয়, তবে আমি একটি উইন 32 প্রোগ্রাম লিখেছি যা এই প্রক্রিয়াটি ব্যবহার করে নিজেকে ডিবাগ করতে পরিচালিত করে। সম্পূর্ণ অকেজো, তবে শিক্ষামূলক।


25

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


1
না (2)আমাদের আরো (বা কম) চেয়ে "ptrace একটি সিস্টেম কল হল" কিছু বলতে?
লেজার

5
@ ই এসকে, আসলেই না। (2)ম্যানুয়াল অধ্যায় সংখ্যা। ম্যানুয়াল বিভাগগুলির বিবরণের জন্য en.wikedia.org/wiki/Man_page#Manual_sections দেখুন ।
অ্যাডাম রোজেনফিল্ড

2
@ অ্যাডামরোসেনফিল্ড এই ব্যতীত যে বিভাগ 2টি বিশেষত "সিস্টেম কল"। সুতরাং পরোক্ষভাবে, হ্যাঁ, এটি আমাদের বলে যে ptraceএটি একটি সিস্টেম কল।
জোনাথন রেইনহার্ট

1
আরও ব্যবহারিকভাবে, (2)আমাদের জানিয়েছে যে আমরা man 2 ptraceসঠিক ম্যানপেজটি টাইপ করতে পারি এবং পেতে পারি - এখানে গুরুত্বপূর্ণ নয় কারণ ptraceলঙ্ঘনের জন্য অন্য কোনও নেই , তবে লিনাক্সের man printfসাথে তুলনা করার জন্য man 3 printf
পাতলা

9

আপনি যদি উইন্ডোজ ওএসে থাকেন তবে এর জন্য একটি দুর্দান্ত সংস্থান হবে জন রবিনসের "মাইক্রোসফ্ট। নেট এবং মাইক্রোসফ্ট উইন্ডোজের জন্য ডিবাগিং অ্যাপ্লিকেশনগুলি":

(বা এমনকি পুরানো সংস্করণ: "ডিবাগিং অ্যাপ্লিকেশনগুলি" )

বইটিতে একটি ডিবাগার কীভাবে কাজ করে সে সম্পর্কে একটি অধ্যায় রয়েছে যাতে বেশ কয়েকটি সহজ (তবে কর্মক্ষম) ডিবাগারগুলির কোড অন্তর্ভুক্ত রয়েছে।

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


3

ডিবাগিং বোঝার জন্য আরেকটি মূল্যবান উত্স হ'ল ইন্টেল সিপিইউ ম্যানুয়াল (ইন্টেল ®৪ এবং আইএ -32 আর্কিটেকচার সফটওয়্যার ডেভেলপারের ম্যানুয়াল)। অধ্যায় 3 এ, অধ্যায়ের 16-এ, এটি ডিবাগিংয়ের হার্ডওয়্যার সমর্থন, যেমন বিশেষ ব্যতিক্রম এবং হার্ডওয়্যার ডিবাগিং রেজিস্ট্রি প্রবর্তন করে। নিম্নলিখিত অধ্যায়টি থেকে:

টি (ট্র্যাপ) পতাকা, টিএসএস - টিএসএস-এ টি পতাকা সেট সহ কোনও কার্যে স্যুইচ করার চেষ্টা করা হলে একটি ডিবাগ ব্যতিক্রম (# ডিবি) উত্পন্ন করে।

উইন্ডো বা লিনাক্স এই পতাকাটি ব্যবহার করবে কিনা তা আমি নিশ্চিত নই, তবে এই অধ্যায়টি পড়া খুব আকর্ষণীয়।

আশা করি এটি কাউকে সাহায্য করবে।


2

আমি মনে করি এখানে উত্তর দেওয়ার জন্য দুটি প্রধান প্রশ্ন রয়েছে:

1. ডিবাগার কীভাবে জানেন যে একটি ব্যতিক্রম ঘটেছে?

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

এখানে চিত্র বর্ণনা লিখুন


২. ডিবাগার কীভাবে ব্রেকপয়েন্টে থামতে জানেন?

সরল উত্তরটি হ'ল: আপনি যখন প্রোগ্রামটিতে একটি ব্রেক-পয়েন্ট রাখেন, তখন ডিবাগারটি আপনার কোডটি সেই সময়টি একটি int3 নির্দেশের সাথে প্রতিস্থাপন করে যা একটি সফ্টওয়্যার বিঘ্নিত হয় । প্রভাব হিসাবে প্রোগ্রাম স্থগিত করা হয় এবং ডিবাগার বলা হয়।


1

আমার বোধগম্যতা হল আপনি যখন কোনও অ্যাপ্লিকেশন বা ডিএলএল ফাইল সংকলন করেন তখন এতে যা কিছু সংকলন করা হয় তাতে ফাংশন এবং ভেরিয়েবলগুলির প্রতিনিধিত্বকারী চিহ্ন থাকে।

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


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