কোনও ব্যতিক্রম ঘটে না যাওয়া পর্যন্ত জিডিবিতে একটি অ্যাপ্লিকেশন চালান


102

আমি একটি বহুবিবাহিত অ্যাপ্লিকেশন নিয়ে কাজ করছি, এবং আমি এটি জিডিবি ব্যবহার করে ডিবাগ করতে চাই।

সমস্যাটি হ'ল, আমার একটি থ্রেড বার্তাটি দিয়ে মারা যাচ্ছে:

pure virtual method called
terminate called without an active exception
Abort

আমি এই বার্তার কারণ জানি কিন্তু আমার থ্রেডে এটি কোথায় ঘটে তা আমার কোনও ধারণা নেই। একটি ব্যাকট্রেস সত্যিই সহায়ক হবে।

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


জিডিবি যখন বিরতি দেয় তখন কী সংকেত জানাচ্ছে? আপনার যেমন কমান্ড চালাতে সক্ষম হওয়া উচিতhandle SIGUSR1 pass noprint nostop
হস্তুরকুন

উত্তর:


147

আপনি catch throwযেখানে ব্যতিক্রম উত্পন্ন হয় সেখানে ডিবাগারটি থামাতে "ক্যাচপয়েন্ট" ( ) ব্যবহার করে চেষ্টা করতে পারেন ।

নিম্নলিখিত উদ্ধৃতাংশ GDB ম্যানুয়াল থেকে catchpoint বৈশিষ্ট্য বর্ণনা করা হয়েছে।


5.1.3 সেটপয়েন্ট পয়েন্ট স্থাপন করা হচ্ছে

নির্দিষ্ট ধরণের প্রোগ্রাম ইভেন্টের জন্য সি -++ ব্যতিক্রম বা ভাগ করা লাইব্রেরি লোড হওয়ার কারণে আপনি ডিবাগারটি থামানোর জন্য ক্যাচপয়েন্টগুলি ব্যবহার করতে পারেন। ক্যাচপয়েন্ট সেট করতে ক্যাচ কমান্ডটি ব্যবহার করুন।

  • ঘটনা ধরা

    বন্ধ করুন যখন ঘটনা ঘটে। ইভেন্ট নিম্নলিখিত যে কোনও হতে পারে:

    • নিক্ষেপ

      একটি সি ++ ব্যতিক্রম ছোঁড়া।

    • ধরা

      একটি সি ++ ব্যতিক্রম ধরা।

    • Exec

      কার্যকর করার জন্য একটি কল। এটি বর্তমানে কেবল এইচপি-ইউএক্সের জন্য উপলব্ধ।

    • কাঁটাচামচ

      কাঁটাচামচ কল এটি বর্তমানে কেবল এইচপি-ইউএক্সের জন্য উপলব্ধ।

    • vfork

      ভিফোর্কে একটি কল। এটি বর্তমানে কেবল এইচপি-ইউএক্সের জন্য উপলব্ধ।

    • নাম অথবা লোডের নাম লোড করুন

      যে কোনও ভাগ করা লাইব্রেরির গতিশীল লোডিং, বা লাইব্রেরির উপাধি লোড। এটি বর্তমানে কেবল এইচপি-ইউএক্সের জন্য উপলব্ধ।

    • লাইবনেম আনলোড বা আনলোড করুন

      যে কোনও গতিশীল লোড হওয়া ভাগ করা লাইব্রেরিটি আনলোড করা বা লাইব্রেরির নাম নামকরণ আনলোড। এটি বর্তমানে কেবল এইচপি-ইউএক্সের জন্য উপলব্ধ।

  • tcatch ইভেন্ট

    একটি ক্যাচপয়েন্ট সেট করুন যা কেবলমাত্র একটি স্টপের জন্য সক্ষম। ইভেন্টটি প্রথমবার ধরা পড়ার পরে ক্যাচপয়েন্টটি স্বয়ংক্রিয়ভাবে মোছা হয়।

info breakবর্তমান ক্যাপপয়েন্টগুলি তালিকা করতে কমান্ডটি ব্যবহার করুন ।

জিডিবিতে বর্তমানে সি ++ ব্যতিক্রম হ্যান্ডলিংয়ের (ক্যাচ থ্রো এবং ক্যাচ ক্যাচ) কিছু সীমাবদ্ধতা রয়েছে:

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

  • আপনি ইন্টারেক্টিভভাবে একটি ব্যতিক্রম উত্থাপন করতে পারবেন না।

  • আপনি ইন্টারেক্টিভভাবে একটি ব্যতিক্রম হ্যান্ডলার ইনস্টল করতে পারবেন না।

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

ব্যতিক্রম হ্যান্ডলার বলার আগে থামার জন্য আপনার বাস্তবায়নের কিছু জ্ঞান প্রয়োজন need জিএনইউ সি ++ এর ক্ষেত্রে, __raise_exception নামে একটি লাইব্রেরি ফাংশন কল করে ব্যতিক্রমগুলি উত্থাপিত হয় যা নিম্নলিখিত এএনএসআই সি ইন্টারফেসে রয়েছে:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

যেকোন স্ট্যাক আনওয়াইন্ডিংয়ের আগে ডিবাগারটিকে সমস্ত ব্যতিক্রমী করে তুলতে __raise_exception এ একটি ব্রেকপয়েন্ট নির্ধারণ করুন (বিভাগ ব্রেকপয়েন্টস; ওয়াচপয়েন্টস এবং ব্যতিক্রমগুলি দেখুন)।

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


আপনি ধরার জন্য ব্যতিক্রমের ধরণও উল্লেখ করতে পারেন, যেমন catch throw std::runtime_exception
স্কাই

5

__ বিশুদ্ধ_ ভার্চুয়াল উপর একটি ব্রেকপয়েন্ট সেট করুন


@ জেফ্রেহিল উত্তরে, একে এখন __cxa_pure_virtual বলা হয়। আমি কীভাবে এটি চেক করব জানি না, তাই আমি উত্তরটি সম্পাদনা করতে চাই না। আমি ডাউন-ভোট দেওয়ার ইচ্ছা করি না, তবে উত্তরটি এখনই ভুল হতে পারে এবং সঠিক কেউ জানেন এমন কোনও ব্যক্তির দ্বারা সম্পাদনা করা উচিত।
ফিলিপ ক্লেন

5

এফডব্লিউআইডাব্লু, স্পষ্টতই, গিসি ৪.১ এ, উপযুক্ত ফাংশনটির নাম পরিবর্তন হয়েছে এবং এই ফাংশনে একটি অবশ্যই একটি ব্রেকপয়েন্ট নির্ধারণ করতে হবে।

__cxa_pure_virtual


0

কেবলমাত্র নীচে একজন জিডিবি 8.3 দিয়ে আমার জন্য কাজ করেছেন:

break _Unwind_RaiseException

"ক্যাচ থ্রো" বা "ব্রেক __cxx_throw" আমার পক্ষে কাজ করে না।

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