স্মৃতি দুর্নীতির ডিবাগিং


23

প্রথমত, আমি বুঝতে পারি যে এটি একটি নিখুঁত উত্তর সহ একটি নিখুঁত প্রশ্নোত্তর শৈলীর প্রশ্ন নয়, তবে এটিকে আরও ভাল করে তোলার জন্য আমি কোনও শব্দার্থের কথা ভাবতে পারি না। আমি মনে করি না এর কোনও নিখুঁত সমাধান আছে এবং এটি স্ট্যাক ওভারফ্লোয়ের পরিবর্তে এখানে পোস্ট করার কারণগুলির একটি এটি।

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

আমার দেব / পরীক্ষার পরিবেশে আমি এটি নির্ভরযোগ্যভাবে পুনরুত্পাদন করতে পারি না, এমনকি কিছু লোড অনুকরণের জন্য আদিম বটগুলি প্রয়োগ করার পরেও আমি ক্র্যাশ পেতে পারি না (আমি একটি মুক্তির ইস্যু স্থির করেছিলাম যা কিছু জিনিস তৈরি করেছিল)

আমি এ পর্যন্ত চেষ্টা করেছি:

এটিকে নষ্ট করে দেওয়া - কোনও জিনিস ক্র্যাশ না হওয়া অবধি কোনও অবৈধ লেখেনি (যা উত্পাদনে 1+ দিন সময় লাগতে পারে .. বা মাত্র এক ঘন্টা) যা সত্যিই আমাকে বিস্মিত করছে, অবশ্যই কিছু সময় এটি অবৈধ স্মৃতিতে অ্যাক্সেস করবে এবং স্টাফকে ওভাররাইট না করে সুযোগ? (ঠিকানা সীমা "ছড়িয়ে দেওয়ার" উপায় আছে কি?)

কোড-বিশ্লেষণ সরঞ্জামগুলি, যেমন কভারিটি এবং সিপিচেক। কোডটিতে কিছু ঘৃণ্যতা এবং প্রান্তের কেসগুলি চিহ্নিত করার সময় গুরুতর কিছু ছিল না।

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

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

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

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

আমি কি কোন কার্যকর কৌশল মিস করেছি? আপনি কিভাবে মোকাবেলা করবেন? (এটি এত সাধারণ হতে পারে না যেহেতু এ সম্পর্কে খুব বেশি তথ্য নেই ... বা আমি কি সত্যিই অন্ধ?)

সম্পাদনা:

এটি কিছু ক্ষেত্রে বিবেচনা করে:

গিসি ৪.7 (ডিবিয়ান হুইজি দ্বারা সরবরাহিত সংস্করণ) এর মাধ্যমে সি ++ (১১) ব্যবহার করা হচ্ছে

কোডবেস প্রায় 150k লাইন

ডেভিড.পিএফএক্স পোস্টের প্রতিক্রিয়াতে সম্পাদনা করুন: (ধীর প্রতিবেদনের জন্য দুঃখিত)

নিদর্শনগুলির জন্য আপনি কি ক্র্যাশগুলির যত্ন সহকারে রেকর্ড রাখছেন?

হ্যাঁ, আমার কাছে এখনও পড়ে আছে সাম্প্রতিক ক্রাশগুলির ডাম্পগুলি

কয়েকটি জায়গাগুলি কি সত্যিই সমান? কোন পথে?

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

দুর্নীতিগ্রস্থ ডেটা দেখতে কেমন? Zeros? ASCII? প্যাটার্নস?

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

এটি কি গাদা সম্পর্কিত?

এটি সম্পূর্ণরূপে হিপ-সম্পর্কিত (আমি জিসিসির স্ট্যাক গার্ড সক্ষম করেছিলাম এবং এটি কিছুই ধরেনি)।

দুর্নীতির পরে কি ঘটে free()?

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

নেটওয়ার্ক ট্র্যাফিক (বাফার আকার, পুনরুদ্ধার চক্র) সম্পর্কে আলাদা কিছু আছে কি?

নেটওয়ার্ক ট্র্যাফিক কাঁচা ডেটা নিয়ে গঠিত। সুতরাং চরের অ্যারে, (ইউ) ইনটেক্স_টি বা প্যাকড (প্যাডিং অপসারণের জন্য) আরও জটিল জিনিসের জন্য স্ট্রাক্ট, প্রতিটি প্যাকেটে একটি আইডি এবং প্যাকেট আকারের সমন্বয়ে একটি শিরোলেখ থাকে যা প্রত্যাশিত আকারের বিপরীতে বৈধ হয়। এগুলি কয়েকটি এমবি আকার ধারণ করে বৃহত্তম (অভ্যন্তরীণ 'বুটআপ' প্যাকেটটি শুরুতে একবার গুলি চালানো) দিয়ে প্রায় 10-60 বিট হয় by

প্রচুর এবং প্রচুর উত্পাদন দৃ production়। ক্ষতির প্রচারের আগে তাড়াতাড়ি এবং অনুমানযোগ্য ক্রাশ sh

আমার একবার std::mapদুর্নীতির সাথে সম্পর্কিত ক্র্যাশ হয়েছিল , প্রতিটি সত্তার এটির "ভিউ" এর মানচিত্র রয়েছে, প্রতিটি সত্তা এটি দেখতে পারে এবং এর বিপরীতে রয়েছে। আমি সামনে এবং পরে 200 বাইটের বাফার যুক্ত করেছি, এটি 0x33 দিয়ে পূরণ করেছি এবং প্রতিটি অ্যাক্সেসের আগে এটি পরীক্ষা করেছিলাম। দুর্নীতিটি স্রেফ যাদুকরীভাবে নিখোঁজ হয়ে গেছে, আমি অবশ্যই এমন কিছু পদক্ষেপ নিয়ে এসেছি যা এটিকে অন্যরকম দূষিত করেছিল made

কৌশলগত লগিং, সুতরাং আপনি ঠিক কী আগে ঠিক কি ঘটেছে তা জানেন। উত্তরের কাছাকাছি যাওয়ার সাথে লগিংয়ে যুক্ত করুন।

এটি কাজ করে .. একটি প্রসারিত করতে।

হতাশায়, আপনি কি রাষ্ট্র এবং স্বয়ংক্রিয় পুনঃসূচনা সংরক্ষণ করতে পারেন? আমি কয়েক টুকরো প্রোডাকশন সফটওয়্যার সম্পর্কে ভাবতে পারি যা এটি করে।

আমি কিছুটা করি। সফ্টওয়্যারটিতে একটি মূল "ক্যাশে" প্রক্রিয়া এবং কিছু অন্যান্য কর্মী থাকে যা সমস্ত স্টাফ পেতে এবং সংরক্ষণ করতে ক্যাশে অ্যাক্সেস করে। ক্র্যাশ প্রতি আমি খুব বেশি অগ্রগতি হারাব না, এটি এখনও সমস্ত ব্যবহারকারীর সংযোগ বিচ্ছিন্ন করে এবং আরও অনেক কিছু এটি অবশ্যই সমাধান নয়।

সংমেয়: থ্রেডিং, রেসের শর্তাদি ইত্যাদি etc

"অ্যাসিঙ্ক" অনুসন্ধানগুলি করার জন্য একটি মাইএসকিএল থ্রেড রয়েছে, এটি সমস্তই অচ্ছুত এবং কেবল সমস্ত লক সহ ফাংশনগুলির মাধ্যমে ডাটাবেস শ্রেণিতে তথ্য ভাগ করে দেয়।

ব্যাঘাত

এটি লকিং থেকে আটকাতে একটি বাধা টাইমার রয়েছে যে এটি যদি 30 সেকেন্ডের জন্য একটি চক্রটি সম্পন্ন না করে তবেই বাতিল হয়, কোডটি নিরাপদ হওয়া উচিত:

if (!tics) {
    abort();
} else
    tics = 0;

টিকগুলি হ'ল volatile int tics = 0;প্রতিটি চক্র সম্পূর্ণ হওয়ার পরে বৃদ্ধি করা হয়। ওল্ড কোডও।

ইভেন্ট / কলব্যাক / ব্যাতিক্রম: দুর্নীতির অবস্থা বা অনাকাঙ্ক্ষিত স্ট্যাক

প্রচুর কলব্যাক ব্যবহার করা হচ্ছে (async নেটওয়ার্ক I / O, টাইমার), তবে তাদের খারাপ কিছু করা উচিত নয়।

অস্বাভাবিক ডেটা: অস্বাভাবিক ইনপুট ডেটা / সময় / রাষ্ট্র

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

একটি অ্যাসিনক্রোনাস বাহ্যিক প্রক্রিয়ার উপর নির্ভরতা।

বিশদ যত্ন? এটি কিছুটা ক্ষেত্রে, উপরে বর্ণিত ক্যাশে প্রক্রিয়া। আমার মাথার উপরের অংশটি কেবলমাত্র আমি কল্পনা করতে পারি তা হ'ল এটি যথেষ্ট তাড়াতাড়ি শেষ না করা এবং আবর্জনার ডেটা ব্যবহার না করা, তবে এটি নেটওয়ার্কের ব্যবহারের পরেও নয়। একই প্যাকেট মডেল।


7
দুঃখজনকভাবে, অ-তুচ্ছ সি ++ অ্যাপগুলিতে এটি হেলা সাধারণ common আপনি যদি সোর্স কন্ট্রোল ব্যবহার করছেন, কোন কোড পরিবর্তন কী কারণে সমস্যাটির কারণ হতে পারে তা সংকীর্ণ করতে বিভিন্ন চেঞ্জসেটগুলি পরীক্ষা করে, তবে সম্ভবত এই ক্ষেত্রে সম্ভব হয় না।
টেলাস্টিন

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

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

কোডগুলির কিছু অংশ মন্তব্য করে শুরু করুন যতক্ষণ না আপনার আর ক্রাশ হয় না।
সিপিপি

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

উত্তর:


21

এটি একটি চ্যালেঞ্জিং সমস্যা তবে আমার সন্দেহ হয় যে আপনি ইতিমধ্যে দেখেছেন এমন ক্র্যাশগুলিতে আরও অনেক চিহ্ন পাওয়া যাবে।

  • নিদর্শনগুলির জন্য আপনি কি ক্র্যাশগুলির যত্ন সহকারে রেকর্ড রাখছেন?
  • কয়েকটি জায়গাগুলি কি সত্যিই সমান? কোন পথে?
  • দুর্নীতিগ্রস্থ ডেটা দেখতে কেমন? Zeros? ASCII? প্যাটার্নস?
  • কোন মাল্টি থ্রেডিং জড়িত আছে? এটি একটি দৌড় শর্ত হতে পারে?
  • এটি কি গাদা সম্পর্কিত? মুক্ত () এর পরে দুর্নীতি কি ঘটে?
  • এটি স্ট্যাক সম্পর্কিত? স্ট্যাকটি কি দূষিত হয়?
  • ঝুঁকির রেফারেন্স কি কোনও সম্ভাবনা? একটি ডাটা মান যা রহস্যজনকভাবে পরিবর্তিত হয়েছে?
  • নেটওয়ার্ক ট্র্যাফিক (বাফার আকার, পুনরুদ্ধার চক্র) সম্পর্কে আলাদা কিছু আছে কি?

আমরা একই পরিস্থিতিতে ব্যবহার করেছি।

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

হতাশায়, আপনি কি রাষ্ট্র এবং স্বয়ংক্রিয় পুনঃসূচনা সংরক্ষণ করতে পারেন? আমি কয়েক টুকরো প্রোডাকশন সফটওয়্যার সম্পর্কে ভাবতে পারি যা এটি করে।

আমরা যদি কিছুটা সহায়তা করতে পারি তবে বিশদ বিবরণ যুক্ত করুন।


আমি কি যুক্ত করতে পারি যে এর মতো গুরুতর অনির্দিষ্ট বাগগুলি যে সমস্ত সাধারণ নয়, এবং এমন অনেকগুলি জিনিস নেই যা (সাধারণত) তাদের কারণ হতে পারে। তারা সহ:

  • সংমেয়: থ্রেডিং, রেসের শর্তাদি ইত্যাদি etc
  • বাধা / ইভেন্ট / কলব্যাক / ব্যতিক্রম: দুর্নীতির অবস্থা বা স্ট্যাক অপ্রত্যাশিত
  • অস্বাভাবিক ডেটা: অসম্পূর্ণ ইনপুট ডেটা / সময় / রাষ্ট্র
  • একটি অ্যাসিনক্রোনাস বাহ্যিক প্রক্রিয়ার উপর নির্ভরতা।

এই ফোকাস করার কোড এর অংশ।


+1 সমস্ত ভাল পরামর্শ, বিশেষত জোর, গার্ড এবং লগিং।
andy256

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

5

মলোক / বিনামূল্যে একটি ডিবাগিং সংস্করণ ব্যবহার করুন। এগুলি মোড়ানো এবং প্রয়োজনে আপনার নিজের লিখুন। অনেক মজা!

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

দুর্নীতির সবচেয়ে কুখ্যাত উত্সগুলির একটি হ'ল মুক্ত হওয়ার পরে একটি অংশকে ব্যবহার করা অবিরত। নিখরচায় একটি মুক্ত নিদর্শন (traditionতিহ্যগতভাবে, 0xDEADBEEF) দিয়ে মুক্ত মেমরিটি পূরণ করা উচিত এটি বরাদ্দ কাঠামোগুলিতে একটি "ম্যাজিক নম্বর" উপাদান অন্তর্ভুক্ত করে এবং কাঠামোগত ব্যবহারের আগে যথাযথ যাদু সংখ্যার জন্য চেক অন্তর্ভুক্ত করে তা সহায়তা করে helps


1
ভালগ্রাইন্ডের দ্বিগুণ ফ্রি / ফ্রিড্ড ডেটা ব্যবহার করা উচিত, তবে তা করা উচিত নয়?
রবিন

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

3

আপনার প্রশ্নে আপনি যা বলছেন তা বর্ণনা করার জন্য আপনাকে একটি নির্দিষ্ট উত্তর দেওয়া সম্ভব নয়। আমরা সবচেয়ে ভাল যা করতে পারি তা হল সন্ধানের জন্য জিনিসগুলির পরামর্শ এবং সরঞ্জাম এবং কৌশল is

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

লক্ষণ থেকে

  • আমার কাছে এটি বাফারকে ছাড়িয়ে যাওয়ার মতো শোনাচ্ছে।

  • সম্পর্কিত সমস্যাটি অবৈধ সকেট ডেটা সাবস্ক্রিপ্ট বা কী হিসাবে ব্যবহার করছে ইত্যাদি using

  • আপনি কি বৈশ্বিক পরিবর্তনশীল কোথাও ব্যবহার করছেন, বা বৈশ্বিক এবং একই নামে স্থানীয়, বা কোনওরকম কোনও খেলোয়াড়ের ডেটা অন্যর সাথে হস্তক্ষেপ করছে তা কি সম্ভব?

অনেকগুলি বাগের মতো আপনি সম্ভবত কোথাও একটি অবৈধ অনুমান করছেন। বা সম্ভবত একাধিক। একাধিক মিথস্ক্রিয় ত্রুটি সনাক্ত করা শক্ত।

  • প্রতিটি পরিবর্তনশীল একটি বর্ণনা আছে? এবং আপনি একটি বৈধতা দৃser়তা সংজ্ঞায়িত করতে পারেন?
    এগুলি যুক্ত না করা থাকলে কোডের মাধ্যমে স্ক্যান করে দেখুন যে প্রতিটি ভেরিয়েবল সঠিকভাবে ব্যবহৃত হয়েছে। যেখানেই তা বোঝা যায় সেই যুক্তি যুক্ত করুন।

  • প্রচুর দৃser়তা যুক্ত করার পরামর্শটি একটি ভাল: এগুলি দেওয়ার প্রথম স্থানটি প্রতিটি ফাংশন এন্ট্রি পয়েন্টে রয়েছে। যুক্তি এবং কোনও প্রাসঙ্গিক বৈশ্বিক রাষ্ট্রের বৈধতা দিন।

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

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


3

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

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

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

আপনি তৃতীয় পক্ষের লাইব্রেরি থেকে বরাদ্দ ফাঁদে ফেলতেও গুরুত্বপূর্ণ, যাতে আপনি সেগুলিও যথাযথভাবে লগইন করতে পারেন। আপনি কখনই জানেন না যে এটি কোথা থেকে এসেছে।

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


0

মেমরি ঠিকানার যেখানে এটি ক্র্যাশ হয়ে গেছে তাতে একটি ওয়াচ পয়েন্ট সেট করার চেষ্টা করুন। অকার্যকর স্মৃতিশক্তি তৈরির নির্দেশিকায় জিডিবি ভঙ্গ হবে। তারপরে পিছনের ট্রেসের সাহায্যে আপনি আপনার কোড দেখতে পাচ্ছেন যা দুর্নীতির কারণ হয়ে দাঁড়িয়েছে। এটি দুর্নীতির উত্স নাও হতে পারে তবে প্রতিটি দুর্নীতির জন্য ওয়াচ পয়েন্টটি পুনরাবৃত্তি করা সমস্যার উত্স হতে পারে।

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

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