কীভাবে জিডিবি একটি কার্যবিধিতে বিরতি দেয়


16

আপনারা জানেন যে, আমরা জিডিবি ব্যবহার করতে পারি এবং ডিবাগিংয়ের জন্য মৃত্যুদন্ড স্থগিত করতে আমাদের কোডে ব্রেকপয়েন্টগুলি সেট করতে পারি।

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

এটি কি কেবল সামগ্রীর স্ন্যাপশট এবং লাইভ ডেটা নয়?


2
যখন ওএস আপনার প্রোগ্রামটিকে এক মুহুর্তের জন্য বিরতি দেবে এবং অন্যরকম চালাবে তখন কীভাবে সমস্ত নিবন্ধগুলি ওভাররাইট হবে না?
ব্যবহারকারী 253751

সিপিপিসন 2018: সাইমন ব্র্যান্ড "হাউ সি ++ ডিবাগারগুলি কীভাবে কাজ করে" youtube.com/watch?v=0DDrseUomfU
রবার্ট অ্যান্ড্রেজুক

উত্তর:


24

এটি স্থাপত্যের সাথে সামান্য পরিবর্তিত হয়, তবে গুরুত্বপূর্ণ বিষয়গুলি সর্বজনীনভাবে প্রয়োগ হয়:

  • বিঘ্নিত সার্ভিসিংয়ের কারণে সিএসইউ রাষ্ট্রের (রেজিস্টারগুলি সহ) আইএসআর চালানোর আগে মেমরিতে সংরক্ষণ করা হয় এবং আইএসআর প্রস্থান হওয়ার সাথে সাথে পুনরুদ্ধার করা হয়।

  • কোনও বাধা পরিষেবা রুটিন যদি সেই নিবন্ধগুলি সংরক্ষিত হয় সেখানে মেমরিের অবস্থানের সামগ্রীটি অদলবদল করে, তবে এটি প্রসঙ্গের স্যুইচ সম্পাদন করতে পারে । প্রতিটি থ্রেডের একটি মেমরি অঞ্চল থাকে যেখানে থ্রেড চলমান না হলে এর রেজিস্টারগুলি সংরক্ষণ করা হয়।

  • কনটেক্সট স্যুইচটি থ্রেড শিডিয়ুলার দ্বারা নিয়ন্ত্রিত হয় যা থ্রেড আই / ও, সিঙ্ক্রোনাইজেশন, তার অগ্রাধিকার কী, সিগন্যাল বিতরণ ইত্যাদির জন্য অপেক্ষা করছে কিনা তা বিবেচনায় নেয় Often প্রায়শই একটি স্থগিত গণনা থাকে যা প্রকৃত হয়।

  • ডিবাগার স্থগিতাদেশ গণনা বৃদ্ধি করতে পারে, যা গ্যারান্টি দেয় যে থ্রেডটি চালানো যায় না। তারপরে এটি থ্রেডের সংরক্ষিত অনুলিপিগুলির নিরীক্ষণ (এবং পরিবর্তন) করতে পারে।


14

@ বেনভয়েগ্টের দুর্দান্ত তথ্যের পাশাপাশি আমাকে কিছু সংযোজন করার অনুমতি দিন:

প্রক্রিয়াটিতে একটি মেশিন কোড মান (কোনও নির্দেশ বা কোনও নির্দেশের অংশ) প্রতিস্থাপন করে একটি ব্রেকপয়েন্টটি সেট করা হয় যাতে কোডে অবস্থিত একটি নির্দিষ্ট ফাঁদ নির্দেশের সাথে ডিবাগ করা যায় যা বিরতিতে কাঙ্ক্ষিত (উত্স) লাইনের সাথে মিলে যায়। এই নির্দিষ্ট ফাঁদ নির্দেশটি ব্রেকপয়েন্ট হিসাবে ব্যবহারের জন্য বোঝানো হয়েছে - ডিবাগার এটি জানেন এবং অপারেটিং সিস্টেমটিও এটি জানেন।

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

ডিবাগকারী তখন ডিগ্রিগ করা প্রসেস / থ্রেডের সংরক্ষিত অবস্থায় অ্যাক্সেস করার জন্য সিস্টেম কলগুলি ব্যবহার করে calls

কোডটি লঙ্ঘনকারী (পুনরায় চালু) কার্যকর করতে (যা বর্তমানে নির্দিষ্ট ফাঁদ নির্দেশ রয়েছে), ডিবাগার মূল মেশিন কোডের মানটি পুনরুদ্ধার করবে ব্রেক ব্রেকপয়েন্ট ট্র্যাপ নির্দেশের মাধ্যমে ওভাররোট করে, সম্ভবত অন্য কোনও ট্র্যাপ সেট করে (যেমন যদি একক পদক্ষেপ, অথবা ব্যবহারকারী নতুন ব্রেকপয়েন্টগুলি তৈরি করে) এবং প্রক্রিয়া / থ্রেডকে রান্নেবল হিসাবে চিহ্নিত করুন, সম্ভবত @Ben বর্ণিত একটি প্রক্রিয়া ব্যবহার করে।

আসল বিবরণগুলি আরও জটিল হতে পারে, এতে দীর্ঘক্ষণ চলমান ব্রেকপয়েন্টটি ধরে রাখার অর্থ হ'ল রিয়েল কোডের জন্য ব্রেকপয়েন্ট ট্র্যাপটি অদলবদলের মতো এমন কিছু করা যাতে লাইনটি চলতে পারে এবং তারপরে আবার ব্রেকপয়েন্টটি আবার অদলবদল করে ...

যারা নিবন্ধগুলি অন্য ওএস প্রক্রিয়া দ্বারা নিয়মিত ব্যবহৃত হচ্ছে না? তারা কীভাবে ওভাররাইট করা যায় না?

যেমন @ বেন বর্ণনা করেছেন, ইতিমধ্যে বিদ্যমান থ্রেড স্থগিত / পুনরায় শুরু বৈশিষ্ট্য ( মাল্টিটাস্কিংয়ের প্রসঙ্গ স্যুইচিং / অদলবদল ) ব্যবহার করে যা প্রসেসরকে সময় কাটা ব্যবহার করে একাধিক প্রক্রিয়া / থ্রেড দ্বারা ভাগ করে নিতে দেয়।

এটি কি কেবল সামগ্রীর স্ন্যাপশট এবং লাইভ ডেটা নয়?

এটি উভয়ই। যেহেতু থ্রেড যে ব্রেকপয়েন্ট আঘাত স্থগিত করা হয়, এটা সাসপেনশন সময় লাইভ ডেটার একটি স্ন্যাপশট (CPU- র রেজিস্টার, ইত্যাদি ..), এবং CPU- র রেজিস্টার মূল্যবোধের প্রামাণিক মাস্টার প্রসেসর থ্রেড হতে পুনরায় শুরু করা উচিত মধ্যে পুনঃস্থাপন । আপনি যদি সিবিইউ রেজিস্টারগুলি পড়ার এবং / অথবা পরিবর্তন করার জন্য ডিবাগারের ইউজার ইন্টারফেস ব্যবহার করেন (প্রক্রিয়াটি ডিবাগ হচ্ছে) এটি পড়বে এবং / অথবা সিস্টেম কলগুলি ব্যবহার করে এই স্ন্যাপশট / মাস্টার পরিবর্তন করবে।


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

"যদি আপনি সিপিইউ নিবন্ধগুলিকে পরিবর্তন করেন ..." শেষ অনুচ্ছেদে, আমি মনে করি আপনার অর্থ হ'ল "আপনি যদি সিইপি রেজিস্টারগুলির সংরক্ষিত অনুলিপি পরিবর্তন করেন ..." তারপরে ওএস যখন প্রক্রিয়াটি পুনরায় শুরু করে, সেই পরিবর্তিত তথ্যটি আবার লেখা হয় প্রকৃত রেজিস্টারে।
জামেস্কেফ

@ জামেস্কেফ, হ্যাঁ, থেক্স!
এরিক tদ

@ বেনভয়েট, সম্মত যদিও ডিবাগারগুলি সীমাহীন সংখ্যক ব্রেকপয়েন্টগুলি পরিচালনা করতে পারে, হার্ডওয়্যার শূন্য বা কয়েকটি হ্যান্ডেল করতে পারে, তাই ডিবাগারকে কিছু জাগলিং করতে হয়।
এরিক tদ

@ জামেস্কফ: কপি হিসাবে বর্ণনা করা কিছুটা বিভ্রান্তিকর। থ্রেড চলমান অবস্থায় এটি থ্রেডের রাজ্যের অফিসিয়াল স্টোরেজ।
বেন ভয়েগট

5

কড়া কথায় বলতে গেলে, কমপক্ষে বেশিরভাগ সাধারণ ক্ষেত্রে, জিডিবি নিজেই ফাঁসি কার্যকর করে না। বরং, জিডিবি ওএসকে জিজ্ঞাসা করে, এবং ওএস কার্যকর করতে বিরতি দেয়।

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

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

যখন ডিবাগারটি কোনও থ্রেড বিরতি দেওয়ার দরকার হয়, এটিতে OS ওএস সেই থ্রেডটিকে ঠিক একইভাবে বিরতি দেয় যা অন্যান্য কারণে হয়। তারপরে, বিরতিযুক্ত থ্রেডের অবস্থা পড়তে, ডিবাগার থ্রেডের সংরক্ষিত অবস্থার দিকে নজর দেয়। আপনি যদি রাষ্ট্রটি পরিবর্তন করেন তবে ডিবাগারটি সংরক্ষিত অবস্থায় লেখেন, যখন তখন থ্রেডটি পুনরায় শুরু হওয়ার পরে কার্যকর হয়।

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