আমার একটি কমান্ড লাইন অ্যাপ্লিকেশন রয়েছে যে রান যখন করা উচিত তখন তা করে না এবং একটি নির্দিষ্ট সময়ে বার্তাটি ছেড়ে দেয়:
Segmentation fault
এটার মানে কি? আমার কি করা উচিৎ?
আমার একটি কমান্ড লাইন অ্যাপ্লিকেশন রয়েছে যে রান যখন করা উচিত তখন তা করে না এবং একটি নির্দিষ্ট সময়ে বার্তাটি ছেড়ে দেয়:
Segmentation fault
এটার মানে কি? আমার কি করা উচিৎ?
উত্তর:
একটি বিভাজন ত্রুটি একটি মেমরি অ্যাক্সেস লঙ্ঘনের ফলাফল। প্রোগ্রামটি যা বরাদ্দ করা হয়েছিল তার বাইরে একটি মেমরি ঠিকানা উল্লেখ করেছে এবং ওএস কার্নেল 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
কাজ করতে পারে, বা ম্যান পৃষ্ঠাটি এটি কীভাবে পেতে পারে তা নির্দেশ করতে পারে),
কেউ আশা করছেন খুব বেশিদিনের মধ্যেই আপনার কাছে ফিরে আসবেন। বাগ ফাইল করা সাধারণত প্রশংসিত হয়।
এর অর্থ হল যে অ্যাপ্লিকেশনটিতে একটি বাগ রয়েছে।
আপনি যদি শেষ ব্যবহারকারী হন তবে আপনার অ্যাপ্লিকেশন বিক্রেতার সাথে যোগাযোগ করা উচিত।
এটি যদি আপনার নিজস্ব প্রয়োগ হয় তবে আপনি:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
কোর ফাইলগুলি নিজেকে বাদ দিয়ে অন্য বিকাশকারীদের জন্যও খুব কার্যকর হবে - ক্র্যাশের মুহুর্তে এগুলিতে প্রোগ্রামের পুরো অবস্থা রয়েছে; আপনি যদি কোনও বাগ রিপোর্ট ফাইল করতে চলেছেন তবে সেগুলি সংযুক্ত করুন এবং কিছু ক্ষেত্রে আপনার অ্যাপ বাইনারি রয়েছে। সচেতন হোন যে আপনার ব্যক্তিগত ডেটা যেমন অ্যাকাউন্ট নম্বর, পাসওয়ার্ড এবং অনুরূপ ক্রাশের মুহুর্তে প্রোগ্রামটির স্মৃতিতে থাকতে পারে small অনেক ক্ষেত্রে, ক্র্যাশড থ্রেডের কেবল ব্যাকট্রাস্টের প্রতিবেদন করা বিকাশকারীদের সমস্যাটি খুঁজে পেতে বড় সহায়তা। ব্যাকট্রেস পেতে, আপনি ডিবাগার (পছন্দ gdb executable corefile
) এর সাথে কোর ফাইল লোড করতে পারেন ।