সেগমেন্টেশন ফল্ট (কোর ডাম্পড) - কোথায়? এটা কি? এবং কেন?


16

লিনাক্সে যখন সেগমেন্টেশন ত্রুটি দেখা দেয় তখন ত্রুটি বার্তাটি Segmentation fault (core dumped)টার্মিনালে মুদ্রিত হবে (যদি থাকে), এবং প্রোগ্রামটি সমাপ্ত হবে। সি / সি ++ দেব হিসাবে, আমার সাথে প্রায়শই এটি ঘটে এবং আমি সাধারণত এটিকে উপেক্ষা করে gdbআবার অবৈধ স্মৃতি রেফারেন্সটি ট্রিগার করার জন্য আমার পূর্ববর্তী ক্রিয়াটি পুনরায় শুরু করি onto পরিবর্তে, আমি ভেবেছিলাম যে আমি সম্ভবত এই "কোর" ব্যবহার করতে সক্ষম হব, কারণ gdbসমস্ত সময় চালানো বরং ক্লান্তিকর, এবং আমি সবসময় বিভাগের ত্রুটিটিকে পুনরায় তৈরি করতে পারি না।

আমার প্রশ্ন তিনটি:

  • কোথায় এই অধরা "কোর" ফেলে দেওয়া হয়?
  • এতে কী রয়েছে?
  • আমি এটি দিয়ে কি করতে পারি?

সাধারণত আপনার কেবল কমান্ডের প্রয়োজন হয় gdb path-to-your-binary path-to-corefile, তারপরে info stackঅনুসরণ করুন Ctrl-d। একমাত্র উদ্বেগজনক বিষয় হ'ল কোর-ডাম্পিং আপনার জন্য একটি স্বাভাবিক জিনিস।
ott--

খুব বেশি স্বাভাবিক নয় , মাঝে মধ্যে - বেশিরভাগ সময় এটি টাইপসের কারণে বা এমন কিছু ঘটেছিল যা আমি পরিবর্তন করেছিলাম এবং ফলাফলটিকে প্রশ্রয় দেয়নি।
জো

উত্তর:


16

অন্য লোকেরা যদি পরিষ্কার করে দেয় ...

... আপনি সাধারণত কিছুই পান না। তবে ভাগ্যক্রমে লিনাক্সের একটি হ্যান্ডলার রয়েছে যা আপনি রানটাইমে নির্দিষ্ট করতে পারবেন। ইন /usr/src/linux/Documentation/sysctl/kernel.txt আপনি পাবেন:

[/ proc / sys / কার্নেল /] কোর_প্যাটার্ন একটি কোর ডাম্পফিল প্যাটার্নের নাম নির্দিষ্ট করতে ব্যবহৃত হয়।

  • যদি প্যাটার্নের প্রথম অক্ষরটি '|' হয় তবে কার্নেলটি বাকি প্যাটার্নটি চালানোর আদেশ হিসাবে বিবেচনা করবে। কোর ডাম্প কোনও ফাইলের পরিবর্তে সেই প্রোগ্রামের স্ট্যান্ডার্ড ইনপুটটিতে লেখা হবে।

( ধন্যবাদ )

উত্স অনুসারে এটি abrtপ্রোগ্রাম দ্বারা পরিচালিত হয় (এটি স্বয়ংক্রিয় বাগ রিপোর্টিং সরঞ্জাম, বাতিল নয়), তবে আমার আর্চ লিনাক্সে এটি সিস্টেম দ্বারা পরিচালিত হয়। আপনি নিজের হ্যান্ডলারটি লিখতে বা বর্তমান ডিরেক্টরিটি ব্যবহার করতে চাইতে পারেন।

কিন্তু সেখানে কি আছে?

এখন এতে যা রয়েছে তা সিস্টেম নির্দিষ্ট, তবে সমস্ত জ্ঞানকোষের মতে :

[একটি কোর ডাম্প] একটি নির্দিষ্ট সময়ে কম্পিউটার প্রোগ্রামের ওয়ার্কিং মেমোরির রেকর্ডড স্টেট নিয়ে গঠিত [...]। অনুশীলনে, প্রোগ্রাম স্টেটের অন্যান্য মূল টুকরা সাধারণত একই সাথে প্রসেসরের রেজিস্টারগুলিতে ফেলে দেওয়া হয়, যার মধ্যে প্রোগ্রামের কাউন্টার এবং স্ট্যাক পয়েন্টার, মেমরি পরিচালনার তথ্য এবং অন্যান্য প্রসেসর এবং অপারেটিং সিস্টেমের পতাকা ও তথ্য অন্তর্ভুক্ত থাকতে পারে।

... সুতরাং এটিতে মূলত যা যা gdbচাইত সবই রয়েছে এবং আরও অনেক কিছু।

হ্যাঁ, তবে আমি জিডিবির পরিবর্তে আমাকে খুশি রাখতে চাই

আপনি উভয় যেহেতু খুশি হতে পারে gdbহিসাবে আপনি আপনার এক্সিকিউটেবল একটি সঠিক অনুলিপি রয়েছে যতদিন কোন কোর ডাম্প লোড করা হবে: gdb path/to/binary my/core.dump। এরপরে আপনি যথারীতি ব্যবসা চালিয়ে যেতে সক্ষম হবেন এবং বাগগুলি সংশোধন করতে ব্যর্থ করার পরিবর্তে বাগগুলি সংশোধন করার চেষ্টা করে এবং ব্যর্থ হওয়ার কারণে বিরক্ত হবেন।


6

এছাড়াও, যদি ulimit -cফিরে আসে 0, তবে কোনও কোর ডাম্প ফাইল লেখা হবে না।

দেখুন কোর লিনাক্স আবেদন ক্র্যাশ দ্বারা উত্পন্ন ফাইল জন্য অনুসন্ধান করতে কোথায়?

আপনি নিজে থেকে একটি মূল ডাম্পও ট্রিগার করতে পারেন CTRL- \যা প্রক্রিয়াটি ছেড়ে দেয় এবং কোর ডাম্পের কারণ হয়।


4

মূল ফাইলটি সাধারণত বলা হয় coreএবং প্রক্রিয়াটির বর্তমান ওয়ার্কিং ডিরেক্টরিতে অবস্থিত। তবে একটি মূল ফাইল কেন উত্পন্ন হবে না তার কারণগুলির একটি দীর্ঘ তালিকা রয়েছে এবং এটি অন্য কোনও নামে সম্পূর্ণ অন্য কোথাও অবস্থিত হতে পারে। দেখুন core.5 man পৃষ্ঠা বিস্তারিত জানার জন্য:

বর্ণনা

নির্দিষ্ট সিগন্যালের ডিফল্ট ক্রিয়াটি হ'ল একটি প্রক্রিয়াটি সমাপ্তির সময় একটি মূল ডাম্প ফাইল , একটি ডিস্ক ফাইলের সমাপ্তির সময় প্রক্রিয়াটির মেমোরির চিত্র ধারণ করে ter এই চিত্রটি কোনও ডিবাগারে (উদাহরণস্বরূপ, জিডিবি (1)) ব্যবহার করা যেতে পারে এটি শেষ হওয়ার পরে প্রোগ্রামটির অবস্থা পরীক্ষা করতে। সিগন্যালগুলির একটি তালিকা যা কোনও প্রক্রিয়াটির কারণে কোর ডাম্প করে দেয় তার সংকেত পাওয়া যায় (7)।

...

কোর ডাম্প ফাইল তৈরি হয় না এমন বিভিন্ন পরিস্থিতিতে রয়েছে:

   *  The process does not have permission to write the core file.  (By
      default, the core file is called core or core.pid, where pid is
      the ID of the process that dumped core, and is created in the
      current working directory.  See below for details on naming.) 
      Writing the core file will fail if the directory in which it is to
      be created is nonwritable, or if a file with the same name exists
      and is not writable or is not a regular file (e.g., it is a
      directory or a symbolic link).
   *  A (writable, regular) file with the same name as would be used for
      the core dump already exists, but there is more than one hard link
      to that file.
   *  The filesystem where the core dump file would be created is full;
      or has run out of inodes; or is mounted read-only; or the user has
      reached their quota for the filesystem.
   *  The directory in which the core dump file is to be created does
      not exist.
   *  The RLIMIT_CORE (core file size) or RLIMIT_FSIZE (file size)
      resource limits for the process are set to zero; see getrlimit(2)
      and the documentation of the shell's ulimit command (limit in
      csh(1)).
   *  The binary being executed by the process does not have read
      permission enabled.
   *  The process is executing a set-user-ID (set-group-ID) program that
      is owned by a user (group) other than the real user (group) ID of
      the process, or the process is executing a program that has file
      capabilities (see capabilities(7)).  (However, see the description
      of the prctl(2) PR_SET_DUMPABLE operation, and the description of
      the /proc/sys/fs/suid_dumpable file in proc(5).)
   *  (Since Linux 3.7) The kernel was configured without the
      CONFIG_COREDUMP option.

তদ্ব্যতীত, পাগল (2) MADV_DONTDUMP পতাকা নিযুক্ত করা থাকলে একটি কোর ডাম্প প্রক্রিয়াটির ঠিকানা জায়গার কিছু অংশ বাদ দিতে পারে।

কোর ডাম্প ফাইলের নামকরণ

ডিফল্টরূপে একটি কোর ডাম্প ফাইলের নাম कोर হয়, তবে / ডকুমেন্ট ফাইলগুলি নামকরণ করতে ব্যবহৃত টেমপ্লেট সংজ্ঞা দিতে / proc / sys / কার্নেল / কোর_প্যাটার্ন ফাইল (লিনাক্স ২.6 এবং ২.৪.২১) সেট করা যেতে পারে। টেমপ্লেটটিতে% নির্দিষ্টকারী থাকতে পারে যা একটি মূল ফাইল তৈরি করার সময় নিম্নলিখিত মানগুলির দ্বারা প্রতিস্থাপিত হয়:

       %%  a single % character
       %c  core file size soft resource limit of crashing process (since
           Linux 2.6.24)
       %d  dump mode—same as value returned by prctl(2) PR_GET_DUMPABLE
           (since Linux 3.7)
       %e  executable filename (without path prefix)
       %E  pathname of executable, with slashes ('/') replaced by
           exclamation marks ('!') (since Linux 3.0).
       %g  (numeric) real GID of dumped process
       %h  hostname (same as nodename returned by uname(2))
       %i  TID of thread that triggered core dump, as seen in the PID
           namespace in which the thread resides (since Linux 3.18)
       %I  TID of thread that triggered core dump, as seen in the
           initial PID namespace (since Linux 3.18)
       %p  PID of dumped process, as seen in the PID namespace in which
           the process resides
       %P  PID of dumped process, as seen in the initial PID namespace
           (since Linux 3.12)
       %s  number of signal causing dump
       %t  time of dump, expressed as seconds since the Epoch,
           1970-01-01 00:00:00 +0000 (UTC)
       %u  (numeric) real UID of dumped process

2

উবুন্টুতে যে কোনও ক্র্যাশ ঘটে তা লগইন হয়ে যায় / ভার / ক্র্যাশ। উত্সাহিত ক্র্যাশ প্রতিবেদনটি একটি সরঞ্জাম অ্যাপপোর্ট ব্যবহার করে প্যাক করা যাবে

অ্যাপপোর্ট-আনপ্যাক /var/crash/_crash_file.crash 'আনপ্যাক করার পথ'

এবং আনপ্যাক করা রিপোর্টে কোর ডাম্পগুলি ব্যবহার করে পড়া যায়

জিডিবি 'বিড়াল এক্সিকিউটেবলপথ' কোরডম্প

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