প্রোগ্রামটি কেবল রিলিজ বিল্ড হিসাবে ক্র্যাশ হয়েছে - কীভাবে ডিবাগ করবেন?


98

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

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

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

সম্পাদনা করুন: সমস্যাটি প্রকৃতপক্ষে সীমার বাইরে থাকা অ্যারের কারণে হয়েছিল, যা আমি এই পোস্টে আরও বর্ণনা করি । এই সমস্যাটি খুঁজে পেতে আপনার সহায়তার জন্য সবাইকে ধন্যবাদ!


আপনি কি সেই পরীক্ষা পদ্ধতির একটি নমুনা দিতে পারেন?
akalenuk

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

4
বেশিরভাগ উত্তর অনুমানের তুলনায় কিছুটা বেশি। ডিবাগার সংযুক্ত না করে ক্র্যাশিং রিলিজ বিল্ডগুলি বিশ্লেষণ করার কয়েকটি সাধারণ কৌশল রয়েছে: স্ট্যাকওভারফ্লো.com
সেবাস্তিয়ান

উত্তর:


130

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


32
এই মানুষটিকে কেউ সিগার দিবে! আমার ক্ষেত্রে, আমি একটি স্ট্রিংবিল্ডারে যাচ্ছিলাম যার পি / ইনভোক ফাংশনটির যথেষ্ট ক্ষমতা নেই। আমি অনুমান করি যে আপনি যখন ঘুমোচ্ছেন তখন কেউ আপনার মুখের উপর যাদু চিহ্নিতকারী লিখেছেন: ডিবাগারের নীচে তারা আপনার কপালে লিপিবদ্ধ থাকে, যাতে আপনি খেয়াল করেন না, তবে ডিবাগার ছাড়াই তারা আপনাকে ছুরিকাঘাত করে up চক্ষু ... এমন কিছু। এই টিপ জন্য ধন্যবাদ!
নিকোলাস পাইসেকি

4
আমার ক্ষেত্রে এটি ওজেজে-সি ব্যবহার করে কোনও এআরএম প্রসেসরের একটি প্রান্তিককরণ সমস্যা হিসাবে দেখা গেছে।
অলমো

4
11 বছর পরে এবং এটি এখনও সত্যই বাজে ... আপনার ভেক্টরগুলি সংরক্ষণ করতে ভুলবেন না।
ডেভ

4
ঠিক আছে, তাহলে কেউ কীভাবে ডিবাগ মোডের আচরণ পরিবর্তন করতে পারে যাতে একজন আসলে ডিবাগ করতে পারে।
পল চাইল্ডস

4
কিন্তু কিভাবে ডিবাগ কর্মরত সবকিছু আপনি বলে "এখন দেখুন যেখানে বুদ্ধিমান" যেখানে সমস্যা। যদিও আমি মনে করি আপনার উত্তরটি বেশিরভাগ ক্ষেত্রে সঠিক, এবং কী কী সন্ধান করতে হবে তা জানা একটি ভাল শুরু a
পল চাইল্ডস 0

56

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

int* p;
....
if (p == 0) { // do stuff }

ডিবাগ মোডে if টিতে কোডটি কার্যকর করা হয় না তবে রিলিজ মোডে p একটি অপরিজ্ঞাত মান থাকে যা 0 হওয়ার সম্ভাবনা কম, তাই কোডটি প্রায়শই ক্রাশের ফলে কার্যকর করা হয়।

আমি আপনার কোডটি অস্বীকারহীন ভেরিয়েবলগুলির জন্য পরীক্ষা করব। এটি অ্যারের সামগ্রীতেও প্রয়োগ করতে পারে।


সাধারণ কেসগুলি কন্সট্রাক্টর সদস্য ইনিশিয়ালিং তালিকায় সদস্য ভেরিয়েবল স্থাপন করতে ভুলে যাচ্ছেন। একই প্রভাব রয়েছে তবে এটি খুঁজে পাওয়া আরও শক্ত যদি আপনি না জানেন যে সঠিক সদস্যের সূচনাও আপনার উচিত ছিল।
স্টিফেনজ

4
ডিবাগ মোডে ভেরিয়েবলগুলি সাধারণত কিছু 'কমপাইলার সংজ্ঞায়িত ধ্রুবক' থেকে শুরু করা হয় যা ভেরিয়েবলটি কোন অবস্থানে রয়েছে তা নির্দেশ করতে ডিবাগিংয়ে ব্যবহার করা যেতে পারে Example উদাহরণস্বরূপ: পয়েন্টারগুলি NULL বা 0xDeadBeef জনপ্রিয়।
মার্টিন ইয়র্ক

ডিবাগ রানটাইমগুলি সাধারণত কিছু ননজারো মানকে স্মৃতিশক্তির সূচনা করে, বিশেষত যাতে NULL পয়েন্টার পরীক্ষাগুলি কোডটিকে এমন পয়েন্টার হিসাবে কাজ করে যাতে আমরা পয়েন্টারটি নন-নুল করি। অন্যথায় আপনার কাছে এমন কোড রয়েছে যা রিলিজ মোডে ক্র্যাশ করে এমন ডিবাগ মোডে সঠিকভাবে চলে।
মাইকেল বুড়

4
না, ভেরিয়েবলগুলি একেবারে আরম্ভ করা হয় নি এবং যতক্ষণ না তাদের দায়িত্ব অর্পণ করা হয় ততক্ষণ এগুলিকে "ব্যবহার" করা UB হয়। তবে অন্তর্নিহিত মেমরির সামগ্রীগুলি প্রায়শই 0x0000000 বা 0xDEADBEEF বা অন্যান্য স্বীকৃত প্যাটার্ন দ্বারা প্রিফিল হয়।
অরবিট

27

কোনও উত্তর এখনও পর্যন্ত রিলিজ অ্যাপ্লিকেশনগুলি ডিবাগ করার জন্য উপলব্ধ কৌশলগুলি সম্পর্কে একটি গুরুতর ওভারভিউ দেওয়ার চেষ্টা করেনি:

  1. রিলিজ এবং ডিবাগ বিল্ড বিভিন্ন কারণে বিভিন্নভাবে আচরণ করে। এখানে একটি চমৎকার ওভারভিউ। এই প্রতিটি পার্থক্যের কারণে রিলিজ বিল্ডে একটি বাগ তৈরি হতে পারে যা ডিবাগ বিল্ডে নেই।

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

    এখানে ডিগগিং হিপ দুর্নীতিতে আরও।

  3. পূর্ববর্তী সমাধানটি যদি কাজ না করে তবে আপনার হাতছাড়া হওয়া ব্যতিক্রমটি ধরতে হবে এবং ক্র্যাশ হওয়ার ঘটনাটি একটি ময়না তদন্তকারী ডিবাগার সংযুক্ত করতে হবে। আপনি এটির জন্য উদাহরণস্বরূপ WinDbg ব্যবহার করতে পারবেন, এমএসডিএন -এ পাওয়া যায় এমন ময়না-পরবর্তী মরদেহ ডিবাগার এবং তাদের ইনস্টলেশন সম্পর্কে বিশদ

  4. আপনি আপনার ব্যতিক্রম হ্যান্ডলিং কোডটি উন্নত করতে পারেন এবং এটি যদি কোনও প্রোডাকশন অ্যাপ্লিকেশন হয় তবে আপনার উচিত:

    ক। ব্যবহার করে একটি কাস্টম টার্মিনেশন হ্যান্ডলার ইনস্টল করুনstd::set_terminate

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

    একটি প্রোডাকশন অ্যাপ্লিকেশনটিতে আপনি একটি ত্রুটি প্রতিবেদন দেশে ফিরে পাঠাতে চাইতে পারেন, আদর্শভাবে একসাথে একটি ছোট মেমরি ডাম্প যা আপনাকে এখানে বর্ণিত হিসাবে সমস্যাটি বিশ্লেষণ করতে দেয় to

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


16

দেখার জন্য বিষয়গুলি:

অ্যারে ওভাররানস - ভিজ্যুয়াল স্টুডিও ডিবাগার প্যাডিং সন্নিবেশ করায় যা ক্রাশ বন্ধ করতে পারে।

রেসের শর্তাদি - আপনার যদি একাধিক থ্রেড জড়িত থাকে তবে যদি কোনও রেস শর্তটি কেবল তখনই প্রদর্শিত হয় যখন কোনও অ্যাপ্লিকেশন সরাসরি সম্পাদন করা হয়।

লিঙ্কিং - আপনার লাইব্রেরি সঠিক লাইব্রেরিতে টানছে release

চেষ্টা করার বিষয়গুলি:

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


4
হাই - আমার এই উত্তরটির উপর একটি বেনামি মতামত রয়েছে। আমি বুঝতে চাই কেন?
মোড়চিল্লি

12

আপনি WinDbg কে আপনার পোস্টমর্টেম ডিবাগার হিসাবে সেট করতে পারেন। এটি ডিবাগারটি চালু করবে এবং ক্র্যাশ হওয়ার পরে এটি প্রক্রিয়াতে সংযুক্ত হবে। পোস্টমর্টেম ডিবাগিংয়ের জন্য উইনডিবিজি ইনস্টল করতে, / আমি বিকল্পটি ব্যবহার করুন (নোট করুন এটি মূলধনযুক্ত ):

windbg /I

আরও বিশদ এখানে

কারণ হিসাবে, অন্যান্য উত্তরগুলি যেমন এটি সম্ভবত এককীকরণীয় পরিবর্তনশীল।


4
এবং ভুলে যাবেন না যে আপনার সংকলকটি রিলিজ বিল্ডগুলির জন্য এমনকি PDB ফাইলগুলি জেনারেট করতে পারে, যদিও এটি ডিফল্ট নয়।
মাইকেল বার বার 9:48

সত্যই প্রশ্নের একমাত্র আসল উত্তর।
সেবাস্তিয়ান

10

বেশ কয়েক ঘন্টা ডিবাগিংয়ের পরে, অবশেষে আমি সমস্যার কারণটি পেয়েছি যা প্রকৃতপক্ষে একটি বাফার ওভারফ্লো দ্বারা সৃষ্ট হয়েছিল, একটি একক বাইট পার্থক্য সৃষ্টি করেছিল:

char *end = static_cast<char*>(attr->data) + attr->dataSize;

এটি একটি ফেন্সপোস্ট ত্রুটি (একের পর এক ত্রুটি) এবং এটি দ্বারা ঠিক করা হয়েছিল:

char *end = static_cast<char*>(attr->data) + attr->dataSize - 1;

অদ্ভুত বিষয়টি ছিল, আমি আমার কোডের বিভিন্ন অংশের চারপাশে _CrtCheckMemory () এ বেশ কয়েকটি কল দিয়েছি এবং তারা সর্বদা ফিরে এসেছিল 1. "রিটার্ন মিথ্যা" রেখে সমস্যার উত্সটি খুঁজে পেতে পেরেছি; পরীক্ষার ক্ষেত্রে কল করে এবং তারপরে শেষ পর্যন্ত বিচার-এবং-ত্রুটিটি কোথায় ঘটেছিল তা নির্ধারণ করে।

আপনার মন্তব্যের জন্য সবাইকে ধন্যবাদ - আমি আজ উইন্ডবজি.এক্সএ সম্পর্কে অনেক কিছু শিখেছি! :)


8
আজ আমি একই ধরণের সমস্যাটি ডিবাগ করছি এবং _CrtCheckMemory () সর্বদা ফিরে আসছিল। তবে আমি তখন বুঝতে পেরেছি কেন: রিলিজ মোডে, _CrtCheckMemory # এর হিসাবে সংজ্ঞায়িত হয়েছে ((অন্তঃ) 1)।
ব্রায়ান মোরের্তি

7

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

  1. এক্সই চালান, এবং ক্র্যাশ হওয়ার আগে একটি সংযুক্তি প্রক্রিয়াকরণ করুন (ভিজ্যুয়াল স্টুডিওতে সরঞ্জাম মেনু)।
  2. ক্র্যাশ হওয়ার পরে, ডিবাগারটি চালু করতে বিকল্পটি নির্বাচন করুন।

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

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

এনবি: আমি এখানে একটি উইন্ডোজ / ভিজ্যুয়াল স্টুডিও পরিবেশ অনুমান করছি।


3

এর মতো ক্রাশগুলি প্রায়শই ঘটে থাকে কারণ একটি আইডিই সাধারণত অবিচ্ছিন্ন ভেরিয়েবলের বিষয়বস্তুগুলি শূন্য, নাল বা এমন কিছু 'বুদ্ধিমান' মান হিসাবে সেট করে whereas

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


3

ক্রাশ ডাম্পের জন্য যা আপনি বিশ্লেষণ করতে পারেন:

  1. আপনার কোডের জন্য পিডিবি ফাইল তৈরি করুন।
  2. আপনি আপনার ইপি এবং ডলগুলি একই ঠিকানায় লোড করতে রিবাজে।
  3. ডঃ ওয়াটসনের মতো পোস্ট মর্টেম ডিবাগার সক্ষম করুন
  4. ক্র্যাশ অনুসন্ধানকারীর মতো একটি সরঞ্জাম ব্যবহার করে ক্র্যাশ ব্যর্থতার ঠিকানাটি পরীক্ষা করুন ।

উইন্ডোগুলির জন্য ডিবাগিং সরঞ্জামগুলির সরঞ্জামগুলিও আপনার পরীক্ষা করা উচিত । আপনি অ্যাপ্লিকেশনটি পর্যবেক্ষণ করতে পারেন এবং আপনার প্রথম সুযোগ ব্যতিক্রমের আগে থাকা সমস্ত প্রথম সুযোগ ব্যতিক্রম দেখতে পারেন।

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


3

এরূপ ত্রুটি ডিবাগ করার দুর্দান্ত উপায় হ'ল আপনার ডিবাগ বিল্ডের জন্য অনুকূলিতকরণ সক্ষম করা।


2

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

সুতরাং আপনি কিছু লাইন বরাবর পারে:

দীর্ঘ __stdcall মাইফিল্টার (এক্সেসিপশন_পোয়েন্টার *)
{
    হ্যান্ডেল এইচটি = :: ক্রিয়েটিভেন্ট (0,1,0,0);
    যদি (HEvt)
    {
        যদি (ডব্লিউআইএফএফএইএলডি == :: ওয়েটফরসিংলওবজেক্ট (এইচটি, ইনফাইনাইট))
        {
            // লগ ব্যর্থতা
        }
    }

}
// আপনার উইমেন / উইনমেইনের কোথাও:
সেটআপহ্যান্ডেলড এক্সসেপশন ফিল্টার (মাইফিল্টার);

ত্রুটিটি প্রকাশ হওয়ার পরে আমি ডিবাগারটি সংযুক্ত করেছিলাম (গুই প্রোগ্রাম প্রতিক্রিয়া বন্ধ করে দিয়েছিল)।

তারপরে আপনি হয় একটি ডাম্প নিতে পারেন এবং এটির সাথে পরে কাজ করতে পারেন:

.ডাম্প / মা পাথ_ট_ডাম্প_ফাইল

অথবা এখনই এটি ডিবাগ করুন। সবচেয়ে সহজ উপায় ট্র্যাক করা যেখানে প্রসেসরের প্রসঙ্গটি রানটাইম ব্যতিক্রম হ্যান্ডলিং যন্ত্রপাতি দ্বারা সংরক্ষণ করা হয়েছে:

এসডি এসএসপি পরিসীমা 1003f

কমান্ড অনুসন্ধানের দৈর্ঘ্য সরবরাহ করে কন্টেন্ট রেকর্ড (গুলি) এর জন্য স্ট্যাক ঠিকানার স্থান অনুসন্ধান করবে। আমি সাধারণত 'l? 10000' এর মতো কিছু ব্যবহার করি । দ্রষ্টব্য, রেকর্ড হিসাবে অপ্রত্যাশিত বড় সংখ্যা ব্যবহার করবেন না আপনি সাধারণত অনাহীন ব্যতিক্রম ফিল্টার ফ্রেমের নিকটে। 1003f হ'ল প্রসেসরের স্থিতি ক্যাপচার করার জন্য ব্যবহৃত পতাকাগুলির সংমিশ্রণ (আমি বিশ্বাস করি এটি CONTEXT_FULL এর সাথে মিলে যায়)। আপনার অনুসন্ধান এর সাথে দেখতে একই রকম হবে:

0: 000> এসডি এসএসপি l1000
1003f 0012c160 0001003f 00000000 00000000 00000000? ...............

আপনি ফলাফলগুলি আবার পেয়ে গেলে, cxr কমান্ডে ঠিকানাটি ব্যবহার করুন:

.cxr 0012c160

এটি আপনাকে ক্র্যাশ করার সময় ঠিক এই নতুন কন্টেক্সটে নিয়ে যাবে (আপনার অ্যাপ্লিকেশনটি ক্র্যাশ হওয়ার সময় আপনি ঠিক স্ট্যাকের সন্ধান পাবেন)। অতিরিক্তভাবে, ব্যবহার করুন:

.exr -1

কোন ব্যতিক্রম ঘটেছে ঠিক তা সন্ধান করার জন্য।

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


2

কখনও কখনও এটি ঘটে কারণ আপনি "দৃsert়" ম্যাক্রোর ভিতরে গুরুত্বপূর্ণ ক্রিয়াকলাপটি জড়িয়ে রেখেছেন। আপনি জানেন যে, "দাবী" কেবলমাত্র ডিবাগ মোডে অভিব্যক্তিগুলির মূল্যায়ন করে।


1

ডায়াগনস্টিক তথ্য পেতে আপনার সমস্যার বিষয়ে, আপনি কি WinDbg.exe এর বিকল্প হিসাবে adplus.vbs ব্যবহার করার চেষ্টা করেছেন? একটি চলমান প্রক্রিয়া সংযুক্ত করতে, ব্যবহার করুন

adplus.vbs -crash -p <process_id>

বা ক্রাশটি দ্রুত ঘটে এমন ইভেন্টে অ্যাপ্লিকেশনটি শুরু করতে:

adplus.vbs -crash -sc your_app.exe

Adplus.vbs- এ সম্পূর্ণ তথ্য এখানে পাওয়া যাবে: http://support.microsoft.com/kb/286350


1

ডিবাগার সংযুক্ত সঙ্গে Ntdll.dll

কমান্ড লাইন / ডেস্কটপ থেকে প্রবর্তন করার বিপরীতে আইডিই বা উইনডিবিজি থেকে কোনও প্রোগ্রাম চালু করার মধ্যে একটি সামান্য পার্থক্য হ'ল সংযুক্ত ডিবাগারের সাথে লঞ্চ করার সময় (যেমন আইডিই বা উইনডিবিজি) ntdll.dll একটি পৃথক হিপ বাস্তবায়ন ব্যবহার করে যা কিছুটা বৈধতা কার্যকর করে মেমরি বরাদ্দ / মুক্ত।

আপনি ntdll.dllঅপ্রত্যাশিত ব্যবহারকারী ব্রেকপয়েন্টে কিছু প্রাসঙ্গিক তথ্য পড়তে পারেন । সমস্যাটি চিহ্নিত করতে আপনাকে সহায়তা করতে পারে এমন একটি সরঞ্জাম হ'ল পেজহ্যাপ.এক্স.সি

ক্রাশ বিশ্লেষণ

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


1

ভিস্টা এসপি 1 এর আসলে একটি দুর্দান্ত ক্র্যাশ ডাম্প জেনারেটর রয়েছে যা সিস্টেমে তৈরি। দুর্ভাগ্যক্রমে, এটি ডিফল্ট হিসাবে চালু করা হয়নি!

এই নিবন্ধটি দেখুন: http://msdn.microsoft.com/en-us/library/bb787181(VS.85).aspx

এই পদ্ধতির সুবিধা হ'ল আক্রান্ত সিস্টেমে কোনও অতিরিক্ত সফ্টওয়্যার ইনস্টল করার দরকার নেই। এটিকে ধরুন এবং ছিঁড়ে ফেলুন, বাবু!


1

আমার অভিজ্ঞতা হিসাবে, এটি সর্বাধিক স্মরণ দুর্নীতির বিষয়।

উদাহরণ স্বরূপ :

char a[8];
memset(&a[0], 0, 16);

: /*use array a doing some thing */

যখন কেউ কোড চালায় তখন ডিবাগ মোডে স্বাভাবিক হওয়া খুব সম্ভব।

তবে মুক্তির ক্ষেত্রে, এটি ক্র্যাশ / হতে পারে।

আমার জন্য, স্মৃতিচারণের বাইরে থাকা যেখানে রাইমিং করা খুব কষ্টকর।

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


1

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

উদাহরণ:

একটি প্রকল্পে ম্যাথফু অন্তর্ভুক্ত রয়েছে এবং এটি এসটিএল ভেক্টর সহ ক্লাসগুলি ব্যবহার করে: এসটিডি :: ভেক্টর <ম্যাথফু :: ভ্যাক 2> । এসটিএল ডিফল্ট বরাদ্দকারী প্রয়োজনীয় 16-বাইট প্রান্তিককরণের গ্যারান্টি দেয় না বলে এই জাতীয় ব্যবহার সম্ভবত ম্যাথফু :: ভিস 2 আইটেম নির্মাণের সময় ক্রাশের কারণ হতে পারে । এই ক্ষেত্রে ধারণাটি প্রমাণ করার #define MATHFU_COMPILE_WITHOUT_SIMD_SUPPORT 1জন্য, ম্যাথফু অন্তর্ভুক্ত করার আগে একটি নির্ধারণ করতে পারে , রিলিজ কনফিগারেশনে পুনরায় কম্পাইল করে আবার পরীক্ষা করতে পারে।

ডিবাগ এবং RelWithDebInfo কনফিগারেশনের আমার প্রকল্পের জন্য ভাল কাজ, কিন্তু না রিলিজ অন্যতম। এই আচরণের পিছনে কারণ সম্ভবত ডিবাগার বরাদ্দ / ডিলোকেশন অনুরোধগুলি প্রক্রিয়া করে এবং মেমরিতে অ্যাক্সেসগুলি যাচাই করতে এবং যাচাই করতে কিছু মেমরি বুককিপিং করে।

আমি ভিজ্যুয়াল স্টুডিও 2015 এবং 2017 এর পরিবেশগুলির পরিস্থিতিটি অনুভব করেছি।


0

অনুরূপ কিছু আমার সাথে একবার জিসিসির সাথে সুখী হয়। এটি একটি অত্যন্ত আক্রমণাত্মক অপ্টিমাইজেশান হিসাবে পরিণত হয়েছে যা কেবলমাত্র চূড়ান্ত প্রকাশের সময় তৈরি করা হয়েছিল যখন উন্নয়ন প্রক্রিয়া চলাকালীন নয়।

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

এটির সন্ধান করতে আমার অনেক সময় লেগেছে এবং আমি কেবলমাত্র এটিতে এসেছি কারণ আমি একটি নিউজ গ্রুপে জিজ্ঞাসা করেছি এবং কেউ আমাকে এ সম্পর্কে চিন্তাভাবনা করেছে। সুতরাং, আপনার পক্ষেও যদি এটি ঘটছে তবে আমাকে দয়া করে ফিরিয়ে দিন return


0

আমি এই নিবন্ধটি আপনার দৃশ্যের জন্য দরকারী খুঁজে পেয়েছি । আইআরএসটি সংকলক বিকল্পগুলি অল্প বয়স্ক ছিল। আপনার রিলিজ বিল্ড ইত্যাদির জন্য পিডিবি ফাইলগুলি কীভাবে তৈরি করা যায় তা দেখতে আপনার ভিজ্যুয়াল স্টুডিও প্রকল্প বিকল্পগুলির চারপাশে দেখুন etc.


0

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


0

ডিবাগিং রিলিজ বিল্ডগুলি অপ্টিমাইজেশনের ক্রম পরিবর্তন করে যা আপনার কোডের লাইনগুলি কার্যকর করা দেখা যাচ্ছে changing এটা সত্যিই বিভ্রান্ত হতে পারে!

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


তিনি ইতিমধ্যে প্রিন্টফিসগুলি ছিটিয়ে দেওয়ার চেষ্টা করেছেন, সুতরাং বার্তাগুলি জিতেছে; পার্টিতে নতুন কিছু আনবে না।
গ্রেগ হুইটফিল্ড

0

বরাদ্দ হওয়া মেমরিটি কী অবস্থায় রয়েছে তা দেখতে _CrtCheckMemory () ব্যবহার করে দেখুন। সবকিছু ঠিক থাকলে, _CrtCheckMemory ফেরৎ সত্য , অন্য মিথ্যা


0

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


0

ব্যতিক্রম ঘটলে আপনার প্রোগ্রামটি একটি মিনি ডাম্প তৈরি করুন, তারপরে এটি একটি ডিবাগারে খুলুন (উদাহরণস্বরূপ, উইনডিবিজিতে)। দেখার জন্য মূল কার্য: মিনিডাম্পরাইটডাম্প, সেটআপহ্যান্ডলেড এক্সসেপশনফিল্টার


0

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

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


0

আমারও এই সমস্যা ছিল আমার ক্ষেত্রে, রিলিজ মোডের লিঙ্কার সংজ্ঞাতে msvscrtd.dll ছিল। আমরা এটিকে সরিয়ে দিয়েছি এবং বিষয়টি সমাধান হয়েছে।

বিকল্পভাবে, লিঙ্কার কমান্ড লাইন আর্গুমেন্টে / NODEFAULTLIB যুক্ত করাও সমস্যাটি সমাধান করেছে।


-3

আমার এই ত্রুটি ছিল এবং বনাম ক্র্যাশ হয়ে গেছে এমনকি চেষ্টা করার সময়! আমার প্রকল্প. সুতরাং আমি রিলিজ ডিরেক্টরি থেকে অজু ফাইলগুলি ম্যানুয়ালি মুছে ফেলেছি এবং তারপরে এটি ঠিক জরিমানা তৈরি করেছে।


-6

আমি রল্ফের সাথে একমত কারণ পুনরুত্পাদনযোগ্যতা এত গুরুত্বপূর্ণ, আপনার একটি নন-ডিবাগ মোড থাকা উচিত নয়। আপনার সমস্ত বিল্ডগুলি ডিবাজযোগ্য হবে। আপনার ডিবাগিং লোডকে দ্বিগুণের চেয়ে বেশি ডিবাগ করার জন্য দুটি লক্ষ্যমাত্রা থাকা। কেবল "ডিবাগ মোড" সংস্করণটি শিপ করুন, এটি অব্যবহার্য না হলে। কোন ক্ষেত্রে এটি ব্যবহারযোগ্য করে তোলেন।


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

স্টিফেনজ: আমি গেম ডেভেলপারদের বাগ খুঁজে পেতে চাই। আদর্শভাবে, তারা জাহাজ চালানোর আগে, তবে এটি পরে থাকলে, আমি চাই তারা এটিকে পুনরুত্পাদন করতে এবং ট্র্যাক করার জন্য পর্যাপ্ত তথ্য পেতে সক্ষম হবে। যদি এটি গোপন কোড হয় তবে ট্রেডমার্ক প্রয়োগ হয় না। পিডিবি? প্রোটিন ডেটা-ব্যাংক? অজগর ডিবাগার?
wnoise

আইএমএইচও, এটি একটি খারাপ ধারণা। এক্সিকিউটেবলগুলি আরও বড়, তারা অনুকূলিত হয় না এবং অনেক ধীর গতিতে চালায়। এই ঘটনাগুলি সত্যিই খুব বিরল; যদিও বিশেষত ম্যাডেনিং যখন তারা ঘটে। অত্যন্ত বিরল সবচেয়ে খারাপ-কেস ডিবাগিং সম্পর্কে উদ্বিগ্ন, আপনাকে ধারাবাহিকভাবে নিকৃষ্ট পণ্য সরবরাহ করা উচিত নয়। (খনি অনেকগুলি ডাউনভোটের মধ্যে ছিল না।) আমি নাসার জন্য কিছু প্রোগ্রামিং করেছি; এবং আমরা বলেছিলাম যে খালি ন্যূনতম সময়ে, কোডের প্রতিটি লাইন একবার পরীক্ষা করা উচিত। ইউনিট টেস্টিংও সহায়তা করতে পারে।
কোডলুকার 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.