হ্যাপ দুর্নীতির ত্রুটি কীভাবে ডিবাগ করবেন?


165

আমি ভিজ্যুয়াল স্টুডিও ২০০৮ এর অধীনে একটি (নেটিভ) মাল্টি-থ্রেডেড সি ++ অ্যাপ্লিকেশনটি ডিবাগ করছি see আপাতদৃষ্টিতে এলোমেলো অনুষ্ঠানগুলিতে, আমি একটি "উইন্ডোজ একটি ব্রেক পয়েন্ট চালু করেছে ..." ত্রুটিটি পেয়েছি যে এটি একটি দুর্নীতির কারণে হতে পারে গাদা. এই ত্রুটিগুলি তত্ক্ষণাত্ এ মুহূর্তে অ্যাপ্লিকেশনটিকে ক্রাশ করবে না, যদিও এটির অল্পক্ষণ পরে ক্র্যাশ হওয়ার সম্ভাবনা রয়েছে।

এই ত্রুটিগুলির সাথে বড় সমস্যাটি হ'ল দুর্নীতির ঘটনাটি ঘটে যাওয়ার পরেই তারা পপআপ হয় যা বিশেষত একটি বহু-থ্রেড অ্যাপ্লিকেশনটিতে ট্র্যাক এবং ডিবাগ করা তাদেরকে খুব কঠিন করে তোলে।

  • কি ধরণের জিনিস এই ত্রুটি ঘটাতে পারে?

  • আমি কীভাবে তাদের ডিবাগ করব?

টিপস, সরঞ্জাম, পদ্ধতি, আলোকপাত ... স্বাগত।

উত্তর:


128

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

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

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

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

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


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


যেহেতু এমএস ব্যবহারের জন্য বরাদ্দ / ফ্রি / বেড়া মানগুলি অনুসন্ধান করার জন্য আমি এখানে আমার নিজের উত্তর অনুসন্ধান করতে থাকি, মাইক্রোসফ্ট dbgheap পূরণের মানগুলি অন্তর্ভুক্ত করে এমন আরও একটি উত্তর এখানে দেওয়া আছে ।


3
অ্যাপ্লিকেশন ভেরিফায়ার সম্পর্কে একটি লক্ষণীয় বিষয়: যদি আপনি এটি ব্যবহার করেন তবে আপনাকে অবশ্যই আপনার প্রতীক অনুসন্ধানের পথে মাইক্রোসফ্ট সিম্বল সার্ভার প্রতীকগুলির আগে অ্যাপ্লিকেশন ভেরিফায়ারের প্রতীকগুলি অবশ্যই নিবন্ধভুক্ত করতে হবে ... কেন তা জানার জন্য আমাকে কিছুটা অনুসন্ধান করতে লাগলেন! আরআরএফ ছিল না এটির জন্য প্রয়োজনীয় প্রতীকগুলি সন্ধান করা।
লন্ডার

অ্যাপ্লিকেশন ভেরিফায়ার একটি দুর্দান্ত সাহায্য ছিল এবং কিছু অনুমানের সাথে মিলিত হয়ে আমি সমস্যাটি সমাধান করতে সক্ষম হয়েছি! অনেক ধন্যবাদ, এবং সকলের জন্যও, সহায়ক পয়েন্টগুলি সামনে আনার জন্য।

অ্যাপ্লিকেশন যাচাইকারীটি কি WinDbg এর সাথে ব্যবহার করতে হবে, বা এটি ভিজ্যুয়াল স্টুডিও ডিবাগারের সাথে কাজ করা উচিত? আমি এটি ব্যবহার করার চেষ্টা করছি, তবে আমি ভিএস ২০১২-এ ডিবাগ করার সময় এটি কোনও ত্রুটি বাড়ায় না বা দৃশ্যত কিছু করে না।
নাথান রিড

@NathanReed: আমি বিশ্বাস করি ভাল হিসাবে এটি বনাম সাথে কাজ করে - দেখুন msdn.microsoft.com/en-us/library/ms220944(v=vs.90).aspx - যদিও নোট এই লিঙ্কে VS2008 জন্য, আমি নই পরবর্তী সংস্করণ সম্পর্কে নিশ্চিত মেমোরিটি কিছুটা অস্পষ্ট, তবে আমি বিশ্বাস করি যখন আমার "পূর্ববর্তী প্রশ্ন" লিঙ্কটিতে সমস্যাটি ছিল তখন আমি কেবল অ্যাপ্লিকেশন ভেরিফায়ারটি চালিয়েছি এবং বিকল্পগুলি সংরক্ষণ করেছি, প্রোগ্রামটি চালিয়েছি এবং যখন এটি ক্র্যাশ হয়েছিল তখন আমি ডিবিটি ডিবাগ করার জন্য ভিএসকে বেছে নিয়েছি। এভি সবেমাত্র এটি ক্র্যাশ / দৃ as়তার সাথে যুক্ত করেছে। যদিও! আমি জানি যতই না জানি উইন্ডোবিগের সাথে! AVRF কমান্ডটি নির্দিষ্ট। আশা করি অন্যরা আরও তথ্য সরবরাহ করতে পারেন!
লন্ডার

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

35

আপনার আবেদনের জন্য পৃষ্ঠা হিপ সক্ষম করে আপনি প্রচুর হিপ দুর্নীতির সমস্যা সনাক্ত করতে পারেন। এটি করার জন্য আপনাকে gflags.exe ব্যবহার করতে হবে যা উইন্ডোজের ডিবাগিং সরঞ্জামগুলির অংশ হিসাবে আসে

Gflags.exe চালান এবং আপনার এক্সিকিউটেবলের জন্য চিত্র ফাইল বিকল্পগুলিতে "পৃষ্ঠা হিপ সক্ষম করুন" বিকল্পটি চেক করুন।

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


হ্যাঁ তবে একবার আমি আমার কলস্ট্যাক ডাম্প (স্মৃতি দুর্নীতির ক্রাশের পরে) এ ফাংশন কলটি পেয়েছি: wow64! Wow64NotifyDebugger, আমি কী করতে পারি? আমি এখনও জানি না আমার আবেদনে কী ভুল হচ্ছে
Guillaume07

এখানে প্রচুর পরিমাণে দুর্নীতি ডিবাগ করার জন্য gflags চেষ্টা করেছেন, অত্যন্ত দরকারী ছোট সরঞ্জাম, অত্যন্ত প্রস্তাবিত। দেখা গেল আমি মুক্ত মেমরি অ্যাক্সেস করছি, যা যখন gflags দিয়ে চালিত হয় তত্ক্ষণাত্ ডিবাগারে প্রবেশ করবে ... হ্যান্ডি!
ডেভ এফ

দুর্দান্ত সরঞ্জাম! আমি একটি বাগ খুঁজে পেয়েছি, যা আমি বেশ কয়েকদিন ধরে শিকার করছিলাম, কারণ উইন্ডোজ দুর্নীতির ঠিকানা বলে না, কেবল "" কিছু ভুল ", যা সত্যই সহায়ক নয়।
দেবোলাস

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

13

জিনিসগুলি সত্যই কমিয়ে দিতে এবং প্রচুর রানটাইম চেকিং করতে, main()মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও সি ++ এ আপনার বা সমমানের শীর্ষে নীচেরগুলি যুক্ত করার চেষ্টা করুন

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );


8

কি ধরণের জিনিস এই ত্রুটি ঘটাতে পারে?

স্মৃতি সহ দুষ্টু জিনিসগুলি করা, উদাহরণস্বরূপ একটি বাফার শেষে লেখার জন্য, বা গাদা থেকে মুক্ত হওয়ার পরে বাফারকে লেখা।

আমি কীভাবে তাদের ডিবাগ করব?

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

সাবধান থাকুন যে এগুলি আপনার অ্যাপ্লিকেশনটি ধীর করে দেবে, তাই আপনার যদি কোনও সফট-রিয়েল-টাইম অ্যাপ্লিকেশন হয় তবে এগুলি ব্যবহারযোগ্য হতে পারে।

আর একটি সম্ভাব্য ডিবাগিং এইড / সরঞ্জাম হ'ল মাইক্রোকিউলের হিপএজেন্ট।


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

মাইক্রোকিউলের হিপএজেন্ট: এটি সম্পর্কে তেমন কোনও লিখিত বা শোনা যায় না, তবে গাদা দুর্নীতির জন্য এটি আপনার তালিকায় থাকা উচিত।
সম্রাট পাতিল

1
বাউন্ডসেকার ধূমপান পরীক্ষা হিসাবে সূক্ষ্মভাবে কাজ করে, তবে সেই প্রোগ্রামটিকে প্রযোজনায় চালানোর চেষ্টা করার সময় এর অধীনে কোনও প্রোগ্রাম চালানোর কথাও ভাবেন না। আপনি কোন বিকল্পগুলি ব্যবহার করছেন এবং আপনি সংকলক উপকরণ বৈশিষ্ট্যটি ব্যবহার করছেন কিনা তা নির্ভর করে মন্দাটি 60x থেকে 300x পর্যন্ত যে কোনও জায়গায় হতে পারে depending দাবি অস্বীকার: আমি মাইক্রো ফোকাসের জন্য পণ্য বজায় রাখে এমন একটি ছেলে am
রিক পাপো

8

একটি দ্রুত টিপ, আমি মুক্ত স্মৃতিতে অ্যাক্সেস সনাক্তকরণ থেকে পেয়েছি তা হ'ল:

আপনি যদি মেমোরি ব্লকটি অ্যাক্সেস করে এমন প্রতিটি বিবৃতি পরীক্ষা না করেই ত্রুটিটি দ্রুত চিহ্নিত করতে চান, তবে ব্লকটি মুক্ত করার পরে আপনি মেমরি পয়েন্টারটিকে একটি অবৈধ মানতে সেট করতে পারেন:

#ifdef _DEBUG // detect the access to freed memory
#undef free
#define free(p) _free_dbg(p, _NORMAL_BLOCK); *(int*)&p = 0x666;
#endif

5

প্রতিবার কার্যকর এবং পরিশ্রম করার সেরা সরঞ্জামটি হ'ল কোড পর্যালোচনা (ভাল কোড পর্যালোচক সহ)।

কোড পর্যালোচনা ব্যতীত আমি প্রথমে পৃষ্ঠাগুলি চেষ্টা করব । পৃষ্ঠা হিপ সেট আপ করতে কয়েক সেকেন্ড সময় নেয় এবং ভাগ্যক্রমে এটি আপনার সমস্যাটিকে নির্দেশ করতে পারে।

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


4

আপনি গতিশীল বা স্ট্যাটিক সি রানটাইম লাইব্রেরির সাথে সংযোগ করছেন কিনা তাও আপনি দেখতে চাইতে পারেন। যদি আপনার ডিএলএল ফাইলগুলি স্ট্যাটিক সি রানটাইম লাইব্রেরির সাথে লিঙ্ক করে থাকে, তবে ডিএলএল ফাইলগুলির পৃথক হিপ থাকে।

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


3

আপনি কী ধরনের বরাদ্দ ফাংশন ব্যবহার করছেন? আমি সম্প্রতি হিপ * স্টাইলের বরাদ্দকরণের ক্রিয়াগুলি ব্যবহার করে অনুরূপ ত্রুটিটি আঘাত করেছি hit

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

[1] কিছু পরিস্থিতি রয়েছে যেখানে এটি আইনী, তবে এটির জন্য আপনাকে হিপ * এ কলগুলি সিরিয়ালাইজ করা প্রয়োজন এবং এটি মাল্টি থ্রেডেড প্রোগ্রামগুলির ক্ষেত্রে সাধারণত হয় না।


হ্যাঁ: অ্যাপ্লিকেশনটির সংকলক / বিল্ড বিকল্পগুলি দেখুন এবং নিশ্চিত করুন যে এটি সি রান-টাইম লাইব্রেরির "মাল্টি-থ্রেডড" সংস্করণটির সাথে সংযোগ স্থাপনের জন্য তৈরি।
ChrisW

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

উহু. আমার কাছে এটি ঘটেনি যে ওপি সেই হিপ নিয়ে কথা বলবে, সিআরটি-তে থাকা স্তূপ সম্পর্কে নয়।
ChrisW

@ ক্রিসডব্লিউ, প্রশ্নটি বরং অস্পষ্ট তবে আমি 1 সপ্তাহ আগে আমার যে সমস্যাটি বিস্তারিত আলোচনা করেছি তা আঘাত করেছি তাই এটি আমার মনে তাজা।
জেয়ার্ডপাড়

3

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


1

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

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


1

আপনি _CrtSetDbgFlag এর জন্য ভিসি সিআরটি হিপ-চেক ম্যাক্রোগুলি ব্যবহার করতে পারেন : _CRTDBG_CHECK_ALWAYS_DF বা _CRTDBG_CHECK_EVERY_16_DF .. _CRTDBG_CHECK_EVERY_1024_DF


0

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

  • এসটিএল সংগ্রহ থেকে উপাদানগুলি পুনরুক্তি করার সময় অপসারণ করা হচ্ছে (আমি বিশ্বাস করি যে এই জিনিসগুলি ধরার জন্য ভিজ্যুয়াল স্টুডিওতে ডিবাগ পতাকা রয়েছে; কোড পর্যালোচনার সময় আমি এটি ধরেছিলাম)
  • এটি একটি আরও জটিল, আমি এটিকে ধাপে ভাগ করব:
    • নেটিভ সি ++ থ্রেড থেকে, পরিচালিত কোডটিতে ফিরে কল করুন
    • পরিচালিত জমিতে কল করুন Control.Invokeএবং একটি পরিচালনা করা অবজেক্টটি নিষ্পত্তি করুন যা কলব্যাকের সাথে সম্পর্কিত নেটিভ অবজেক্টকে মোড়ানো করে।
    • যেহেতু বস্তুটি এখনও দেশীয় থ্রেডের অভ্যন্তরে বেঁচে আছে (এটি কলব্যাক কলটিতে Control.Invokeশেষ অবধি অবরুদ্ধ থাকবে )। আমি যেটি ব্যবহার করি তা পরিষ্কার করা উচিত boost::thread, তাই আমি থ্রেড ফাংশন হিসাবে কোনও সদস্য ফাংশন ব্যবহার করি।
    • সমাধান : এর পরিবর্তে ব্যবহার করুন Control.BeginInvoke(আমার জিইউআই উইনফর্মগুলি দিয়ে তৈরি হয়েছে) যাতে বস্তুটি বিনষ্ট হওয়ার আগে দেশীয় থ্রেডটি শেষ হতে পারে (কলব্যাকের উদ্দেশ্যটি সূচিতভাবে সূচিত করছে যে থ্রেডটি শেষ হয়েছে এবং অবজেক্টটি ধ্বংস করা যেতে পারে)।

0

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

সুতরাং দেওয়া অন্যান্য প্রতিক্রিয়া ছাড়াও:

কি ধরণের জিনিস এই ত্রুটি ঘটাতে পারে? বিল্ড ফাইলটিতে কিছু দূষিত।

আমি কীভাবে তাদের ডিবাগ করব? প্রকল্প পরিষ্কার এবং পুনর্নির্মাণ। যদি এটি স্থির হয় তবে সম্ভবত সমস্যাটি ছিল।

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