আমি ভাবতে থাকি কীভাবে একটি ডিবাগার কাজ করে? ইতিমধ্যে এক্সিকিউটেবলের সাথে চালিত হওয়ার জন্য 'সংযুক্ত' হতে পারে এমন একটি বিশদ বিবরণ। আমি বুঝতে পারি যে সংকলক কোডটিকে মেশিনের ভাষায় অনুবাদ করে, তবে তারপরে ডিবাগার কীভাবে এটি জড়িত তা 'জানেন'?
আমি ভাবতে থাকি কীভাবে একটি ডিবাগার কাজ করে? ইতিমধ্যে এক্সিকিউটেবলের সাথে চালিত হওয়ার জন্য 'সংযুক্ত' হতে পারে এমন একটি বিশদ বিবরণ। আমি বুঝতে পারি যে সংকলক কোডটিকে মেশিনের ভাষায় অনুবাদ করে, তবে তারপরে ডিবাগার কীভাবে এটি জড়িত তা 'জানেন'?
উত্তর:
কোনও ডিবাগার কীভাবে কাজ করে তার বিশদটি আপনি কী ডিবাগ করছেন এবং ওএস কী তা নির্ভর করে। উইন্ডোজে নেটিভ ডিবাগিংয়ের জন্য আপনি এমএসডিএন: উইন 32 ডিবাগিং এপিআই- তে কিছু বিশদ জানতে পারেন ।
নাম বা প্রক্রিয়া আইডি দ্বারা কোনও প্রক্রিয়াটি সংযুক্ত করার জন্য ব্যবহারকারী ডিবাগারকে বলে। যদি এটি একটি নাম হয় তবে ডিবাগারটি প্রসেস আইডি সন্ধান করবে এবং একটি সিস্টেম কলের মাধ্যমে ডিবাগ সেশন শুরু করবে; উইন্ডোজ অধীনে এটি ডিবাগএকটিভপ্রসেস হবে ।
একবার সংযুক্ত হয়ে গেলে, ডিবাগারটি কোনও ইউআইয়ের মতো অনেকগুলি ইভেন্ট লুপে প্রবেশ করবে, তবে উইন্ডোটিং সিস্টেম থেকে আসা ইভেন্টগুলির পরিবর্তে ওএস ডিবাগ হওয়ার প্রক্রিয়াটির উপর ভিত্তি করে ইভেন্টগুলি উত্পন্ন করবে - উদাহরণস্বরূপ একটি ব্যতিক্রম ঘটবে occur ওয়েটফোর্ডডবুগ এভেন্ট দেখুন ।
ডিবাগার লক্ষ্য প্রক্রিয়াটির ভার্চুয়াল মেমরিটি পড়তে এবং লিখতে সক্ষম হয় এবং এমনকি OS এর সরবরাহিত এপিআইয়ের মাধ্যমে এর নিবন্ধকের মানগুলি সামঞ্জস্য করে। উইন্ডোজের ডিবাগিং ফাংশনগুলির তালিকা দেখুন ।
ডিবাগার ঠিকানা থেকে ভেরিয়েবলের নাম এবং উত্স কোডের অবস্থানগুলিতে অনুবাদ করতে প্রতীক ফাইল থেকে তথ্য ব্যবহার করতে সক্ষম হয়। প্রতীক ফাইল তথ্য API এর পৃথক পৃথক সেট এবং এটি ওএসের মূল অংশ নয়। উইন্ডোজে এটি ডিবাগ ইন্টারফেস অ্যাক্সেস এসডিকে মাধ্যমে ।
আপনি যদি কোনও পরিচালিত পরিবেশ (। নেট, জাভা ইত্যাদি) ডিবাগ করেন তবে প্রক্রিয়াটি সাধারণত দেখতে একই রকম দেখাবে, তবে বিশদটি অন্যরকম, কারণ ভার্চুয়াল মেশিন পরিবেশ অন্তর্নিহিত ওএসের পরিবর্তে ডিবাগ এপিআই সরবরাহ করে।
আমি এটি বুঝতে হিসাবে:
X86 এ সফ্টওয়্যার ব্রেকপয়েন্টগুলির জন্য, ডিবাগারটি নির্দেশের প্রথম বাইটটি CC
( int3
) দিয়ে প্রতিস্থাপন করে । এটি WriteProcessMemory
উইন্ডোজ দিয়ে করা হয়। সিপিইউ যখন সেই নির্দেশ পেয়ে যায় এবং কার্যকর করেint3
, এর ফলে সিপিইউ একটি ডিবাগ ব্যতিক্রম উত্পন্ন করে। ওএস এই বাধাপ্রাপ্ত হয়, উপলব্ধি করে যে প্রক্রিয়াটি ডিবাগ হচ্ছে, এবং ডিবাগার প্রক্রিয়াটি ব্রেকপয়েন্টে আঘাত হানে তা জানিয়ে দেয়।
ব্রেকপয়েন্টে আঘাত হানার পরে এবং প্রক্রিয়াটি বন্ধ হয়ে যাওয়ার পরে, ডিবাগারটি তার ব্রেকপয়েন্টগুলির তালিকায় নজর রাখে এবং CC
সেখানে যে বাইটটি সেখানে ছিল তা প্রতিস্থাপন করে । ডিবাগার সেট করে TF
, ট্র্যাপ ফ্ল্যাগ ইন EFLAGS
(পরিবর্তন করে CONTEXT
) এবং প্রক্রিয়াটি চালিয়ে যায়। ট্র্যাপ ফ্ল্যাগের ফলে সিপিইউ স্বয়ংক্রিয়ভাবে একক-পদক্ষেপ ব্যতিক্রম তৈরি করে (INT 1
পরবর্তী নির্দেশে ) করে।
প্রক্রিয়াটি যখন ডিবাগ করা পরবর্তী সময় বন্ধ হয়ে যায়, তখন ডিবাগার আবার ব্রেক ব্রেকপয়েন্ট নির্দেশের প্রথম বাইটের সাথে প্রতিস্থাপন করে CC
এবং প্রক্রিয়াটি অব্যাহত থাকে।
আমি নিশ্চিত না যে এটি ঠিক একইভাবে এটি সমস্ত ডিবাগার দ্বারা বাস্তবায়িত হয়, তবে আমি একটি উইন 32 প্রোগ্রাম লিখেছি যা এই প্রক্রিয়াটি ব্যবহার করে নিজেকে ডিবাগ করতে পরিচালিত করে। সম্পূর্ণ অকেজো, তবে শিক্ষামূলক।
লিনাক্সে, একটি প্রক্রিয়া ডিবাগিং শুরু হয় পিট্রেস (2) সিস্টেম কল দিয়ে। কিছু সহজ ডিবাগিং কনস্ট্রাক্টস প্রয়োগ করতে কীভাবে ব্যবহার করতে হয় সে সম্পর্কে এই নিবন্ধটিতে দুর্দান্ত টিউটোরিয়াল রয়েছে ptrace
।
(2)
আমাদের আরো (বা কম) চেয়ে "ptrace একটি সিস্টেম কল হল" কিছু বলতে?
(2)
ম্যানুয়াল অধ্যায় সংখ্যা। ম্যানুয়াল বিভাগগুলির বিবরণের জন্য en.wikedia.org/wiki/Man_page#Manual_sections দেখুন ।
ptrace
এটি একটি সিস্টেম কল।
(2)
আমাদের জানিয়েছে যে আমরা man 2 ptrace
সঠিক ম্যানপেজটি টাইপ করতে পারি এবং পেতে পারি - এখানে গুরুত্বপূর্ণ নয় কারণ ptrace
লঙ্ঘনের জন্য অন্য কোনও নেই , তবে লিনাক্সের man printf
সাথে তুলনা করার জন্য man 3 printf
।
আপনি যদি উইন্ডোজ ওএসে থাকেন তবে এর জন্য একটি দুর্দান্ত সংস্থান হবে জন রবিনসের "মাইক্রোসফ্ট। নেট এবং মাইক্রোসফ্ট উইন্ডোজের জন্য ডিবাগিং অ্যাপ্লিকেশনগুলি":
(বা এমনকি পুরানো সংস্করণ: "ডিবাগিং অ্যাপ্লিকেশনগুলি" )
বইটিতে একটি ডিবাগার কীভাবে কাজ করে সে সম্পর্কে একটি অধ্যায় রয়েছে যাতে বেশ কয়েকটি সহজ (তবে কর্মক্ষম) ডিবাগারগুলির কোড অন্তর্ভুক্ত রয়েছে।
যেহেতু আমি ইউনিক্স / লিনাক্স ডিবাগিংয়ের বিশদ সম্পর্কে অবগত নই, তাই এই স্টাফটি অন্য ওএসের ক্ষেত্রে মোটেই প্রযোজ্য নয়। তবে আমি অনুমান করেছি যে খুব জটিল বিষয়গুলির পরিচিতি হিসাবে - যদি বিবরণ এবং এপিআই না হয় - তবে বেশিরভাগ কোনও ওএসের 'পোর্ট' করা উচিত।
ডিবাগিং বোঝার জন্য আরেকটি মূল্যবান উত্স হ'ল ইন্টেল সিপিইউ ম্যানুয়াল (ইন্টেল ®৪ এবং আইএ -32 আর্কিটেকচার সফটওয়্যার ডেভেলপারের ম্যানুয়াল)। অধ্যায় 3 এ, অধ্যায়ের 16-এ, এটি ডিবাগিংয়ের হার্ডওয়্যার সমর্থন, যেমন বিশেষ ব্যতিক্রম এবং হার্ডওয়্যার ডিবাগিং রেজিস্ট্রি প্রবর্তন করে। নিম্নলিখিত অধ্যায়টি থেকে:
টি (ট্র্যাপ) পতাকা, টিএসএস - টিএসএস-এ টি পতাকা সেট সহ কোনও কার্যে স্যুইচ করার চেষ্টা করা হলে একটি ডিবাগ ব্যতিক্রম (# ডিবি) উত্পন্ন করে।
উইন্ডো বা লিনাক্স এই পতাকাটি ব্যবহার করবে কিনা তা আমি নিশ্চিত নই, তবে এই অধ্যায়টি পড়া খুব আকর্ষণীয়।
আশা করি এটি কাউকে সাহায্য করবে।
আমি মনে করি এখানে উত্তর দেওয়ার জন্য দুটি প্রধান প্রশ্ন রয়েছে:
1. ডিবাগার কীভাবে জানেন যে একটি ব্যতিক্রম ঘটেছে?
ডিবাগ করা প্রক্রিয়ায় যখন কোনও ব্যতিক্রম ঘটে, তখন লক্ষ্য প্রক্রিয়ায় নির্ধারিত কোনও ব্যবহারকারী ব্যতিক্রম হ্যান্ডলারের ব্যতিক্রমকে সাড়া দেওয়ার সুযোগ দেওয়ার আগে ডিবাগারটি ওএস দ্বারা অবহিত হয়। যদি ডিবাগার এটি (প্রথম-সম্ভাবনা) ব্যতিক্রম বিজ্ঞপ্তিটি পরিচালনা না করে বেছে নেয়, ব্যতিক্রম প্রেরণের ক্রমটি আরও এগিয়ে যায় এবং লক্ষ্য থ্রেডটি যদি এটি করতে চায় তবে ব্যতিক্রমটি হ্যান্ডেল করার সুযোগ দেওয়া হয়। যদি এসইএইচ ব্যতিক্রম লক্ষ্য প্রক্রিয়া দ্বারা পরিচালিত না হয়, তবে ডিবাগারটিকে অন্য একটি ডিবাগ ইভেন্ট প্রেরণ করা হয়, এটি দ্বিতীয়-চান্স নোটিফিকেশন বলে, এটি অবহিত করার জন্য যে লক্ষ্য প্রক্রিয়াটিতে একটি অযাচিত ব্যতিক্রম ঘটেছে। উৎস
২. ডিবাগার কীভাবে ব্রেকপয়েন্টে থামতে জানেন?
সরল উত্তরটি হ'ল: আপনি যখন প্রোগ্রামটিতে একটি ব্রেক-পয়েন্ট রাখেন, তখন ডিবাগারটি আপনার কোডটি সেই সময়টি একটি int3 নির্দেশের সাথে প্রতিস্থাপন করে যা একটি সফ্টওয়্যার বিঘ্নিত হয় । প্রভাব হিসাবে প্রোগ্রাম স্থগিত করা হয় এবং ডিবাগার বলা হয়।
আমার বোধগম্যতা হল আপনি যখন কোনও অ্যাপ্লিকেশন বা ডিএলএল ফাইল সংকলন করেন তখন এতে যা কিছু সংকলন করা হয় তাতে ফাংশন এবং ভেরিয়েবলগুলির প্রতিনিধিত্বকারী চিহ্ন থাকে।
যখন আপনার কোনও ডিবাগ বিল্ড থাকে, তখন এই চিহ্নগুলি যখন এটি রিলিজ বিল্ড হয় তার চেয়ে অনেক বেশি বিস্তারিত হয়, এভাবে ডিবাগর আপনাকে আরও তথ্য দেয়। আপনি যখন কোনও প্রক্রিয়াটির সাথে ডিবাগারটি সংযুক্ত করেন, এটি বর্তমানে কোন ফাংশনগুলি অ্যাক্সেস করা হচ্ছে তা দেখে এবং এখান থেকে সমস্ত উপলব্ধ ডিবাগিং প্রতীকগুলি সমাধান করে (যেহেতু এটি জানে যে সংকলিত ফাইলটির অভ্যন্তরীণ দেখতে কেমন, তাই এটি মেমরির মধ্যে কী থাকতে পারে তা নির্ধারণ করতে পারে) , ইনটস, ফ্লোটস, স্ট্রিং ইত্যাদির সামগ্রী সহ)। প্রথম পোস্টার যেমন বলেছেন, এই তথ্য এবং এই চিহ্নগুলি কীভাবে কাজ করে তা পরিবেশ এবং ভাষার উপর নির্ভর করে।