প্রথমত, আমি বুঝতে পারি যে এটি একটি নিখুঁত উত্তর সহ একটি নিখুঁত প্রশ্নোত্তর শৈলীর প্রশ্ন নয়, তবে এটিকে আরও ভাল করে তোলার জন্য আমি কোনও শব্দার্থের কথা ভাবতে পারি না। আমি মনে করি না এর কোনও নিখুঁত সমাধান আছে এবং এটি স্ট্যাক ওভারফ্লোয়ের পরিবর্তে এখানে পোস্ট করার কারণগুলির একটি এটি।
গত মাসে আমি আরও আধুনিক এবং মোডে প্রসারিত করতে আরও সহজ হতে সার্ভার কোডের একটি বেশ পুরানো টুকরো (মিম্পোরপিজি) আবার লিখছি। আমি নেটওয়ার্ক অংশ দিয়ে শুরু করেছি এবং আমার জন্য স্টাফগুলি পরিচালনা করতে একটি তৃতীয় পক্ষের লাইব্রেরি (মুক্ত) প্রয়োগ করেছি। সমস্ত রি-ফ্যাক্টরিং এবং কোড পরিবর্তনগুলির সাথে আমি কোথাও মেমরি দুর্নীতির পরিচয় দিয়েছি এবং এটি কোথায় ঘটে তা সন্ধান করার জন্য আমি সংগ্রাম করে যাচ্ছি।
আমার দেব / পরীক্ষার পরিবেশে আমি এটি নির্ভরযোগ্যভাবে পুনরুত্পাদন করতে পারি না, এমনকি কিছু লোড অনুকরণের জন্য আদিম বটগুলি প্রয়োগ করার পরেও আমি ক্র্যাশ পেতে পারি না (আমি একটি মুক্তির ইস্যু স্থির করেছিলাম যা কিছু জিনিস তৈরি করেছিল)
আমি এ পর্যন্ত চেষ্টা করেছি:
এটিকে নষ্ট করে দেওয়া - কোনও জিনিস ক্র্যাশ না হওয়া অবধি কোনও অবৈধ লেখেনি (যা উত্পাদনে 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, টাইমার), তবে তাদের খারাপ কিছু করা উচিত নয়।
অস্বাভাবিক ডেটা: অস্বাভাবিক ইনপুট ডেটা / সময় / রাষ্ট্র
আমি এর সাথে সম্পর্কিত কয়েকটি প্রান্তের কেস পেয়েছি। প্যাকেটগুলি এখনও প্রক্রিয়া চলাকালীন একটি সকেটকে সংযোগ বিচ্ছিন্ন করার ফলে নাল্প্ট্রার এবং এরকম অ্যাক্সেস পাওয়া যায় তবে ক্লাস নিজেই শেষ হয়ে যাওয়ার পরে প্রতিটি রেফারেন্স পরিষ্কার হয়ে যাওয়ার পরে সেগুলি এতক্ষণে সহজেই পাওয়া যায়। (প্রতিটি চক্র সমস্ত ধ্বংস হওয়া বস্তু মুছে ফেলা লুপ দ্বারা ধ্বংস নিজেই পরিচালনা করা হয়)
একটি অ্যাসিনক্রোনাস বাহ্যিক প্রক্রিয়ার উপর নির্ভরতা।
বিশদ যত্ন? এটি কিছুটা ক্ষেত্রে, উপরে বর্ণিত ক্যাশে প্রক্রিয়া। আমার মাথার উপরের অংশটি কেবলমাত্র আমি কল্পনা করতে পারি তা হ'ল এটি যথেষ্ট তাড়াতাড়ি শেষ না করা এবং আবর্জনার ডেটা ব্যবহার না করা, তবে এটি নেটওয়ার্কের ব্যবহারের পরেও নয়। একই প্যাকেট মডেল।
/analyze
) এবং অ্যাপলের ম্যালোক এবং স্ক্রিবল গার্ডগুলিও যুক্ত করুন । আপনার যথাসম্ভব অনেকগুলি মানক ব্যবহার করে যতগুলি সম্ভব সংকলক ব্যবহার করা উচিত কারণ সংকলক সতর্কতাগুলি একটি ডায়াগনস্টিক এবং সময়ের সাথে সাথে তারা আরও ভাল হয়। কোনও সিলভার বুলেট নেই, এবং একটি আকার সব মাপসই করে না। আপনি যত বেশি সরঞ্জাম এবং সংকলক ব্যবহার করেন, তত বেশি কভারেজ সম্পূর্ণ করুন কারণ প্রতিটি সরঞ্জামের শক্তি এবং দুর্বলতা রয়েছে।