Kesalahan segmentasi (core dumped) - ke mana? apa itu? dan mengapa?

16

Ketika kesalahan segmentasi terjadi di Linux, pesan kesalahan Segmentation fault (core dumped)akan dicetak ke terminal (jika ada), dan program akan dihentikan. Sebagai dev C / C ++, ini sering terjadi pada saya, dan saya biasanya mengabaikannya dan melanjutkan gdb, membuat kembali tindakan saya sebelumnya untuk memicu referensi memori yang tidak valid lagi. Alih-alih, saya pikir saya mungkin bisa menggunakan "inti" ini sebagai gantinya, karena berlari gdbsepanjang waktu agak membosankan, dan saya tidak bisa selalu menciptakan kesalahan segmentasi.

Pertanyaan saya tiga:

  • Di mana "inti" yang sulit dipahami ini dibuang?
  • Apa isinya?
  • Apa yang bisa saya lakukan dengannya?
Joe
sumber
Biasanya Anda hanya perlu perintah gdb path-to-your-binary path-to-corefile, lalu info stackdiikuti oleh Ctrl-d. Satu-satunya hal yang mengkhawatirkan adalah bahwa core-dumping adalah hal yang biasa bagi Anda.
ott--
Tidak terlalu biasa , lebih jarang - kebanyakan karena kesalahan ketik atau sesuatu yang saya ubah dan tidak mendahului hasilnya.
Joe

Jawaban:

16

Jika orang lain membersihkan ...

... Anda biasanya tidak menemukan apa pun. Tapi untungnya Linux memiliki handler untuk ini yang dapat Anda tentukan saat runtime. Di /usr/src/linux/Documentation/sysctl/kernel.txt Anda akan menemukan:

[/ proc / sys / kernel /] core_pattern digunakan untuk menentukan nama pola dumpfile inti.

  • Jika karakter pertama dari pola adalah '|', kernel akan memperlakukan sisa pola sebagai perintah untuk dijalankan. Inti dump akan ditulis ke input standar dari program itu, bukan ke file.

( terima kasih )

Menurut sumber ini ditangani oleh abrtprogram (itu Alat Pelaporan Bug Otomatis, bukan batal), tetapi pada Arch Linux saya ditangani oleh systemd. Anda mungkin ingin menulis handler Anda sendiri atau menggunakan direktori saat ini.

Tapi apa yang ada di sana?

Sekarang apa yang dikandungnya adalah spesifik sistem, tetapi menurut semua ensiklopedia :

[A dump inti] terdiri dari keadaan terekam dari memori kerja suatu program komputer pada waktu tertentu [...]. Dalam praktiknya, bagian penting lain dari status program biasanya dibuang pada saat yang sama, termasuk register prosesor, yang mungkin termasuk penghitung program dan penumpukan tumpukan, informasi manajemen memori, dan bendera serta informasi prosesor dan sistem operasi lainnya.

... jadi pada dasarnya berisi semua yang gdbpernah diinginkan, dan banyak lagi.

Ya, tapi saya ingin saya bahagia bukan gdb

Anda berdua bisa bahagia karena gdbakan memuat setiap inti sampah selama Anda memiliki salinan tepat dari eksekusi Anda: gdb path/to/binary my/core.dump. Anda kemudian dapat melanjutkan bisnis seperti biasa dan terganggu dengan mencoba dan gagal memperbaiki bug alih-alih mencoba dan gagal mereproduksi bug.

Sebb
sumber
4

File inti biasanya dipanggil coredan terletak di direktori proses saat ini. Namun, ada daftar panjang alasan mengapa file inti tidak dapat dibuat, dan mungkin terletak di tempat lain, dengan nama yang berbeda. Lihat halaman manual core.5 untuk detail:

DESKRIPSI

Tindakan default dari sinyal-sinyal tertentu adalah untuk menyebabkan proses untuk mengakhiri dan menghasilkan file dump inti , file disk yang berisi gambar dari memori proses pada saat penghentian. Gambar ini dapat digunakan dalam debugger (misalnya, gdb (1)) untuk memeriksa keadaan program pada saat itu dihentikan. Daftar sinyal yang menyebabkan proses untuk membuang inti dapat ditemukan dalam sinyal (7).

...

Ada berbagai keadaan di mana file dump inti tidak diproduksi:

   *  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.

Selain itu, dump inti dapat mengecualikan bagian dari ruang alamat dari proses jika bendera madAD (2) MADV_DONTDUMP digunakan.

Penamaan file dump inti

Secara default, file dump inti bernama core, tetapi file / proc / sys / kernel / core_pattern (karena Linux 2.6 dan 2.4.21) dapat diatur untuk menetapkan template yang digunakan untuk menamai file dump inti. Templat dapat berisi% specifier yang diganti dengan nilai-nilai berikut saat file inti dibuat:

       %%  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
Andrew Henle
sumber
1

Di Ubuntu, semua kerusakan yang terjadi akan masuk ke / var / crash. Laporan kerusakan yang dihasilkan dapat diurai menggunakan apport alat

apport-unpack /var/crash/_crash_file.crash 'path to unpack'

dan kemudian dump inti dalam laporan yang dibongkar dapat dibaca menggunakan

gdb 'cat ExecutablePath' CoreDump

par
sumber