Дефект сегментації (ядро скинуто) - куди? що це? і чому?


16

Коли в Linux відбувається помилка сегментації, повідомлення про помилку Segmentation fault (core dumped)буде надруковано в термінал (якщо такий є), а програма буде припинена. Як розробник C / C ++, це трапляється зі мною досить часто, і я зазвичай його ігнорую і рухаюся gdb, відтворюючи свої попередні дії, щоб знову запустити недійсну посилання на пам'ять. Натомість я подумав, що міг би використати це «ядро» замість цього, оскільки gdbвесь час біг є досить стомлюючим, і я не завжди можу відтворити помилку сегментації.

Мої запитання три:

  • Куди скидається це невловиме «ядро»?
  • Що він містить?
  • Що я можу з цим зробити?

Зазвичай вам потрібна лише команда gdb path-to-your-binary path-to-corefile, після якої info stackслід Ctrl-d. Єдине, що турбує те, що скидання ядра - це звична для вас річ.
ott--

Не так вже й звичайно , рідше - більшість часу це пов’язано з помилками друку чи чимось, що я змінив, і не перешкодив результату.
Джо

Відповіді:


16

Якщо інші люди прибирають ...

... ти зазвичай нічого не знаходить. Але, на щастя, у Linux є обробник для цього, який ви можете вказати під час виконання. У /usr/src/linux/Documentation/sysctl/kernel.txt ви знайдете:

[/ proc / sys / kernel /] core_pattern використовується для визначення імені шаблона дампфеля ядра.

  • Якщо перший символ шаблону є "|", ядро ​​буде розглядати решту шаблону як команду для запуску. Основний дамп буде записаний на стандартний вхід цієї програми замість файлу.

( спасибі )

За даними джерела, цим керує abrtпрограма (це автоматичний інструмент звітування про помилки, а не переривати), але в моєму Arch Linux це обробляється systemd. Ви можете написати власний обробник або скористатися поточним каталогом.

Але що там?

Тепер те, що він містить, є специфічним для системи, але відповідно до всім відомої енциклопедії :

[Основний дамп] складається із записаного стану робочої пам'яті комп'ютерної програми в певний час [...]. На практиці інші ключові фрагменти стану програми зазвичай одночасно скидаються, включаючи регістри процесорів, які можуть включати лічильник програм та покажчик стека, інформацію про управління пам'яттю та інші прапорці та інформацію процесора та операційної системи.

... тож воно в основному містить все, що gdbхотілося, та багато іншого.

Так, але я хотів би, щоб я був щасливим замість gdb

Ви можете як бути щасливим , оскільки gdbбуде завантажувати будь-дамп до тих пір , поки у вас є точна копія виконуваного файлу: gdb path/to/binary my/core.dump. Тоді ви повинні мати можливість продовжувати справу, як зазвичай, і дратуватися, намагаючись і не виправити помилки, а не намагатися відтворити помилки.


6

Крім того, якщо ulimit -cповертається 0, то жоден файл дамп-файлу не буде записаний.

Див. Де шукати основний файл, що генерується внаслідок збою програми Linux?

Ви також можете запустити дамп основної роботи вручну за допомогою CTRL- \що виходить з процесу і викликає дамп серцевини.


4

Основний файл, як правило, викликається coreі знаходиться в поточній робочій директорії процесу. Однак існує довгий перелік причин, чому не буде створено основний файл, і він може бути розташований десь в іншому місці, під іншим іменем. Детальну інформацію див. У головній сторінці core.5 :

ОПИС

Дія за замовчуванням певних сигналів полягає в тому, щоб змусити процес закінчити і створити основний дамп-файл , файл диска, що містить зображення пам'яті процесу під час припинення. Це зображення можна використовувати в налагоджувачі (наприклад, gdb (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.

Крім того, основний дамп може виключати частину адресного простору процесу, якщо був використаний прапор madvise (2) MADV_DONTDUMP.

Іменування основних дамп-файлів

За замовчуванням основний файл дампа має ім’я core, але файл / proc / sys / kernel / core_pattern (оскільки Linux 2.6 та 2.4.21) можна встановити для визначення шаблону, який використовується для імені основних файлів дампа. Шаблон може містити% специфікаторів, які заміщені наступними значеннями при створенні основного файлу:

       %%  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

В Ubuntu будь-який збій, що трапляється, входить у систему / var / crash. Згенерований звіт про аварійне завершення роботи можна розпакувати за допомогою програми інструменту

apport-unpack /var/crash/_crash_file.crash 'шлях до розпакування "

і тоді основний дамп у розпакованому звіті можна прочитати за допомогою

gdb 'cat ExecutablePath' CoreDump

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.