এটি এমন কিছু জিনিস যা আমি কয়েকদিন আগে আবিষ্কার করেছি, আমি নিশ্চিত হয়েছি যে এটি কেবল এই প্রশ্ন থেকে আমার মেশিনে সীমাবদ্ধ নয় ।
এটিকে তিরস্কার করার সহজতম উপায় হ'ল উইন্ডোজ ফর্ম অ্যাপ্লিকেশন শুরু করা, একটি বোতাম যুক্ত করুন এবং এই কোডটি লিখুন:
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show("yada");
Environment.Exit(1); // Kaboom!
}
প্রস্থান () স্টেটমেন্ট কার্যকর হওয়ার পরে প্রোগ্রাম ব্যর্থ হয় । উইন্ডোজ ফর্মগুলিতে আপনি "উইন্ডো হ্যান্ডেল তৈরি করতে ত্রুটি" পান।
পরিচালনা না করা ডিবাগিং সক্ষম করা কী হচ্ছে তা কিছুটা পরিষ্কার করে দেয়। এর COM মোডাল লুপ নির্বাহ এবং WM_PAINT বার্তা বিতরিত হতে দেয় হয়। এটি নিষ্পত্তি ফর্মের জন্য মারাত্মক।
আমি এখন পর্যন্ত একমাত্র সত্যগুলি সংগ্রহ করেছি:
- এটি কেবলমাত্র ডিবাগারের সাথে চলমান সীমাবদ্ধ নয়। এটি একটি ছাড়াও ব্যর্থ হয়। বরং খারাপভাবেই, ডাব্লুইইআর ক্র্যাশ ডায়ালগটি দু'বার প্রদর্শিত হবে ।
- প্রক্রিয়াটির সাক্ষ্যগ্রহণের সাথে এর কোনও যোগসূত্র নেই। Wow64 স্তরটি বেশ কুখ্যাত, তবে যে কোনও এসিপিইউ বিল্ড একইভাবে ক্র্যাশ হয়।
- .NET সংস্করণ, 4.5 এবং 3.5 একইভাবে ক্র্যাশ করার সাথে এর কোনও যোগসূত্র নেই।
- প্রস্থান কোডটি কোনও ব্যাপার নয়।
- প্রস্থান () থেকে কল করার আগে থ্রেড.স্লিপ () কে কল করা এটি ঠিক করে না।
- এটি উইন্ডোজ 8 এর 64৪-বিট সংস্করণে ঘটে এবং উইন্ডোজ একইভাবে প্রভাবিত হবে বলে মনে হয় না।
- এটি তুলনামূলকভাবে নতুন আচরণ হওয়া উচিত, আমি এটি আগে দেখিনি। আমি উইন্ডোজ আপডেটের মাধ্যমে সরবরাহিত কোনও প্রাসঙ্গিক আপডেট দেখতে পাচ্ছি না , যদিও আপডেটের ইতিহাসটি আমার মেশিনে আর সঠিক নয়।
- এটি চূড়ান্তভাবে ব্রেকিং আচরণ। আপনি অ্যাপডোমেনের জন্য ইভেন্ট হ্যান্ডলারে এই জাতীয় কোড লিখবেন nহানডেলড এক্সসেপশন এবং এটি একইভাবে ক্র্যাশ হয়ে গেছে।
আমি বিশেষত আগ্রহী যে আপনি সম্ভবত এই ক্রাশটি এড়াতে কী করতে পারেন। বিশেষত অ্যাপডোমাইন U .NET প্রোগ্রামটি শেষ করার উপায় নেই। অনুগ্রহ করে নোট করুন যে কলিং অ্যাপ্লিকেশন xএক্সিট () বা ফর্ম.ক্লোজ () আনহানডেলড এক্সসেপশনটির জন্য কোনও ইভেন্ট হ্যান্ডলারের ক্ষেত্রে বৈধ নয়, সুতরাং তারা কার্যক্ষেত্র নয়।
আপডেট: মেহরদাদ উল্লেখ করেছেন যে চূড়ান্তকরণকারী থ্রেড সমস্যার অংশ হতে পারে। আমি মনে করি যে আমি এটি দেখছি এবং 2 দ্বিতীয় সময়সামগ্রীর জন্য কিছু প্রমাণও দেখছি যা সিএলআর চূড়ান্তকরণকারী থ্রেডটি কার্যকর করে শেষ করে।
ফাইনালাইজারটি নেটিভ উইন্ডো-এর অভ্যন্তরে orce ফরাসী এক্সিটম্যাসেজলুপ ()। সেখানে একটি আইস উইন্ডো () উইন 32 রয়েছে যা কোড অবস্থানের সাথে মোটামুটিভাবে মিল করে 0x3c অফসেট করে 32-বিট মোডে মেশিন কোডের দিকে তাকালে। দেখে মনে হচ্ছে ইসওয়াইন্ডো () অচল করে দেওয়া। আমি ইন্টার্নালদের জন্য ভাল স্ট্যাক ট্রেস পেতে পারি না তবে ডিবাগারটি মনে করে যে পি / ইনভোক কলটি কেবল ফিরে এসেছে। এটি ব্যাখ্যা করা শক্ত। আপনি যদি আরও ভাল স্ট্যাক ট্রেস পেতে পারেন তবে আমি এটি দেখতে পছন্দ করব। খনি:
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.ForceExitMessageLoop() + 0x3c bytes
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Finalize() + 0x16 bytes
[Native to Managed Transition]
kernel32.dll!@BaseThreadInitThunk@12() + 0xe bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
ফোর্সএক্সিটম্যাসেজলুপ কলের উপরে কিছুই নেই, নিয়ন্ত্রণহীন ডিবাগার সক্ষম করা আছে।
This happens on the 64-bit version of Windows 8
হ্যান্স তাই বলেছেন!
Exit(0)
কিছুটা আগে আমি কিছুটা 64৪ বিট উইন with দিয়ে এই ধরণের আচরণের মুখোমুখি হয়েছি , পরিবর্তন করা কোনও সমস্যা ছাড়াই ExitCode
এখন ব্যবহার করা সাহায্য করে নাProcess.GetCurrentProcess().Kill()