চলমান অ্যাপ্লিকেশনটি "বিভাগীয় ফল্ট" দিয়ে শেষ হয়


40

আমার একটি কমান্ড লাইন অ্যাপ্লিকেশন রয়েছে যে রান যখন করা উচিত তখন তা করে না এবং একটি নির্দিষ্ট সময়ে বার্তাটি ছেড়ে দেয়:

Segmentation fault

এটার মানে কি? আমার কি করা উচিৎ?


উত্তর:


63

একটি বিভাজন ত্রুটি একটি মেমরি অ্যাক্সেস লঙ্ঘনের ফলাফল। প্রোগ্রামটি যা বরাদ্দ করা হয়েছিল তার বাইরে একটি মেমরি ঠিকানা উল্লেখ করেছে এবং ওএস কার্নেল SIGSEGV দিয়ে প্রোগ্রামটিকে হত্যা করে সাড়া দেয়।

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

এটি করার জন্য, আপনি প্রোগ্রামটি gdb(জিএনইউ ডিবাগার) ভিতরে চালিত করতে পারেন, এটি ইতিমধ্যে ইনস্টল না করা থাকলে যে কোনও লিনাক্স ডিস্ট্রো থেকে পাওয়া উচিত (প্যাকেজটিকে কেবল "জিডিবি" বলা হবে)। যদি ভাঙা অ্যাপ্লিকেশনটিকে "ব্রেকডআপ" বলা হয়:

gdb brokenapp

কপিরাইট এবং লাইসেন্সিং সম্পর্কে একটি অনুচ্ছেদে উপস্থিত হবে, এবং শেষে কার্সার সহ একটি প্রম্পট:

(gdb) _ 

লিখুন runএবং এন্টার লিখুন। আপনার যদি যুক্তি সরবরাহ করতে হয় (যেমন -x --foo=bar whatever) সেগুলি যুক্ত করুন ( run -x --foo=bar whatever)) প্রোগ্রামটি যা করে তা করবে, আপনি আউটপুটটি দেখতে পাবেন এবং আপনাকে ইন্টারঅ্যাক্ট করার দরকার হলে আপনি করতে পারেন (নোট আপনি জিডিবির অভ্যন্তরে জিইউআই সহ কোনও প্রকারের প্রোগ্রাম চালাতে পারেন)। যেখানে এটি সাধারণত segfaults আপনি দেখতে পাবেন:

Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _

এখানে আউটপুট দ্বিতীয় লাইন একটি উদাহরণ। এখন টাইপ করুন bt("ব্যাকট্র্যাস" এর জন্য) এবং এন্টার টিপুন। আপনি এটির মতো কিছু দেখতে পাবেন যদিও এটি আরও দীর্ঘ হতে পারে:

(gdb) bt
#0  0x00000000006031c9 in ?? ()
#1  0x000000000040157f in mishap::what() const ()
#2  0x0000000000401377 in main ()

যদি এটি দীর্ঘ হয় তবে আপনি একবারে স্ক্রিনফুল পাবেন এবং সেখানে একটি --More--বার্তা থাকবে। এটি শেষ না হওয়া পর্যন্ত এন্টার টিপুন। আপনি এখন করতে পারেন quit, আউটপুটটি আপনার টার্মিনালে থাকবে। Program received signal SIGSEGVপরবর্তী থেকে সমস্ত কিছু টেক্সট ফাইলে অনুলিপি করুন এবং অ্যাপ্লিকেশনটির বাগ ট্র্যাকার দিয়ে একটি বাগ রিপোর্ট দাখিল করুন; আপনি এইগুলি অনুসন্ধান করে অনলাইনে খুঁজে পেতে পারেন, যেমন "ব্রেকডাপ বাগ রিপোর্ট" - আপনাকে সম্ভবত রেজিস্ট্রেশন করতে হবে যাতে ইমেলের মাধ্যমে কোনও উত্তর আপনাকে পাঠানো যেতে পারে। সমস্যার বিবরণ, আপনি সরবরাহ করেছেন এমন কোনও যুক্তি runইত্যাদি, এবং ব্যাকট্র্যাসের একটি অনুলিপি (যদি এটি খুব দীর্ঘ হয় তবে বাগ ট্র্যাকার ইন্টারফেসে একটি পাঠ্য ফাইল সংযুক্ত করার উপায় থাকতে পারে) অন্তর্ভুক্ত করুন। সংস্করণটিও অন্তর্ভুক্ত করুন, যদি আপনি জানেন তবে এটি কী ( brokenapp --versionকাজ করতে পারে, বা ম্যান পৃষ্ঠাটি এটি কীভাবে পেতে পারে তা নির্দেশ করতে পারে),

কেউ আশা করছেন খুব বেশিদিনের মধ্যেই আপনার কাছে ফিরে আসবেন। বাগ ফাইল করা সাধারণত প্রশংসিত হয়।


1
বিভাজন ত্রুটি অনুবাদকারীর ভাষায়ও দেখা দিতে পারে (এর মাধ্যমে বেশিরভাগ কারণ অনুবাদকের মধ্যে বাগগুলি রয়েছে),
ব্রায়াম

এটি সুপার উপকারী! ভিতরে পা রাখার কোন সম্ভাবনা আছে? একটি স্টপ চিহ্ন রাখুন এবং আরও জানার চেষ্টা করবেন?
জ্লোয় স্মিটার্নি

1
@ ZloySmiertniy অনেক কিছুই gdbকরে । আপনি বিভাগ 5.1
স্বর্ণিলোকস

11

এর অর্থ হল যে অ্যাপ্লিকেশনটিতে একটি বাগ রয়েছে।

  • আপনি যদি শেষ ব্যবহারকারী হন তবে আপনার অ্যাপ্লিকেশন বিক্রেতার সাথে যোগাযোগ করা উচিত।

    • যদি এটি লিনাক্স বিতরণ নিয়ে আসে তবে আপনার সেই বিতরণের জন্য একটি বাগ রিপোর্ট তৈরি করা উচিত।
    • তৃতীয় পক্ষের অ-বাণিজ্যিক অ্যাপ্লিকেশনগুলির জন্য আপনার লেখক বা এই নির্দিষ্ট অ্যাপ্লিকেশন বাগ ট্র্যাকারের কাছে বাগটি প্রতিবেদন করা উচিত। সাধারণত আপনি অ্যাপ্লিকেশন সাইট ব্রাউজ করে বা বাইনারি / উত্স প্যাকেজ ডাউনলোড করে জায়গা খুঁজে পেতে পারেন।
    • বাণিজ্যিক অ্যাপ্লিকেশনগুলির জন্য আপনার সমর্থনটির সাথে যোগাযোগ করা উচিত।
  • এটি যদি আপনার নিজস্ব প্রয়োগ হয় তবে আপনি:

    1. কোর ফাইলগুলি সক্ষম করুন: $ ulimit -c unlimited
    2. ক্রাশটি পুনরুত্পাদন করুন: $ ./yourapp
    3. জিডিবি দিয়ে ডিবাগ ক্রাশ: $ gdb ./yourapp core

কোর ফাইলগুলি নিজেকে বাদ দিয়ে অন্য বিকাশকারীদের জন্যও খুব কার্যকর হবে - ক্র্যাশের মুহুর্তে এগুলিতে প্রোগ্রামের পুরো অবস্থা রয়েছে; আপনি যদি কোনও বাগ রিপোর্ট ফাইল করতে চলেছেন তবে সেগুলি সংযুক্ত করুন এবং কিছু ক্ষেত্রে আপনার অ্যাপ বাইনারি রয়েছে। সচেতন হোন যে আপনার ব্যক্তিগত ডেটা যেমন অ্যাকাউন্ট নম্বর, পাসওয়ার্ড এবং অনুরূপ ক্রাশের মুহুর্তে প্রোগ্রামটির স্মৃতিতে থাকতে পারে small অনেক ক্ষেত্রে, ক্র্যাশড থ্রেডের কেবল ব্যাকট্রাস্টের প্রতিবেদন করা বিকাশকারীদের সমস্যাটি খুঁজে পেতে বড় সহায়তা। ব্যাকট্রেস পেতে, আপনি ডিবাগার (পছন্দ gdb executable corefile) এর সাথে কোর ফাইল লোড করতে পারেন ।


মাইক্রোসফ্টের ডায়লগ বাক্স অনুসারে, আপনার যদি কেবল সমস্যা বজায় থাকে তবে আপনার বিক্রেতার সাথে যোগাযোগ করা উচিত, অন্যথায় বিরক্ত করবেন না। বিরল ক্র্যাশগুলি আসল বাগ নয়, কেবল পুনরুত্পাদনযোগ্য।
কাজ

4
আমার পর্যবেক্ষণটি হ'ল ইউএনআইএক্স সফ্টওয়্যারটির তুলনায় মাইক্রোসফ্ট সফ্টওয়্যারটির মান অনেক ক্ষেত্রেই কম, এবং এটি দুর্দান্ত যে ইউনিক্স বিশ্বে লোকেরা সাধারণত তাদের নির্দেশিকা নির্দেশ করে না।
জেনা 2 এক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.