Segmentasyon hatası (çekirdek boşaltıldı) - nereye? bu ne? ve neden?


16

Linux'ta bir segmentasyon hatası oluştuğunda, hata mesajı Segmentation fault (core dumped)terminale (varsa) yazdırılacak ve program sonlandırılacaktır. Bir C / C ++ geliştiricisi olarak bu oldukça sık başıma geliyor ve genellikle bunu görmezden geliyor ve devam gdbediyorum, geçersiz bellek referansını tekrar tetiklemek için önceki eylemimi yeniden oluşturuyorum. Bunun yerine, gdbher zaman koşmak oldukça sıkıcı olduğundan ve her zaman segmentasyon hatasını yeniden oluşturamadığım için belki de bu "çekirdeği" kullanabileceğimi düşündüm .

Sorularım üç:

  • Bu zor "çekirdek" nereye atılıyor?
  • Ne içeriyor?
  • Bununla ne yapabilirim?

Genellikle sadece komutu gerek gdb path-to-your-binary path-to-corefile, sonra info stackizledi Ctrl-d. Tek endişe verici olan, çekirdek dökümü sizin için olağan bir şeydir.
ott--

Çok olağan değil , daha nadir - çoğu zaman yazım hataları veya değiştirdiğim ve sonucu önermediğim bir şeyden kaynaklanıyor.
Joe

Yanıtlar:


16

Diğer insanlar temizlerse ...

... genellikle hiçbir şey bulamazsınız. Ancak neyse ki Linux'un çalışma zamanında belirleyebileceğiniz bir işleyicisi vardır. In /usr/src/linux/Documentation/sysctl/kernel.txt bulacaksınız:

[/ proc / sys / kernel /] core_pattern bir çekirdek döküm dosyası desen adı belirtmek için kullanılır.

  • Desenin ilk karakteri '|' ise, çekirdek desenin geri kalanını çalıştırılacak bir komut olarak ele alır. Çekirdek dökümü, bir program yerine o programın standart girdisine yazılır.

( teşekkürler )

Kaynağa göre bu abrtprogram tarafından işlenir (bu Otomatik Hata Raporlama Aracıdır, iptal edilmez), ancak Arch Linux'umda systemd tarafından işlenir. Kendi işleyicinizi yazmak veya geçerli dizini kullanmak isteyebilirsiniz.

Ama orada ne var?

Şimdi içerdiği şey sisteme özgüdür, ancak tüm bilen ansiklopediye göre :

[Bir çekirdek dökümü] belirli bir zamanda bir bilgisayar programının çalışma belleğinin kayıtlı durumundan oluşur [...]. Uygulamada, program sayacı ve yığın işaretçisini, bellek yönetim bilgilerini ve diğer işlemci ve işletim sistemi bayraklarını ve bilgilerini içerebilecek işlemci kayıtları da dahil olmak üzere genellikle program durumunun diğer önemli parçaları aynı anda dökülür.

... yani temelde gdbistediği her şeyi ve daha fazlasını içerir.

Evet, ama gdb yerine mutlu olmamı istiyorum

Her ikiniz de mutlu olabilirsiniz çünkü gdbçalıştırılabilir dosyanızın tam bir kopyasına sahip olduğunuz sürece herhangi bir çekirdek dökümü yükler gdb path/to/binary my/core.dump. Daha sonra her zamanki gibi işinize devam edebilmeniz ve hataları yeniden oluşturmayı denemek ve başarısız olmak yerine hataları düzeltmeyi denemek ve başarısız olmak gerekir.



4

Çekirdek dosya normalde çağrılır coreve işlemin geçerli çalışma dizininde bulunur. Ancak, bir çekirdek dosyanın oluşturulmamasının uzun bir nedeni vardır ve bu dosya tamamen başka bir yerde, farklı bir ad altında bulunabilir. Ayrıntılar için core.5 man sayfasına bakınız:

AÇIKLAMA

Bazı sinyaller varsayılan eylemi sona ve üretilmesi için bir işlem neden olan çekirdek döküm dosyası , sona erdiği zaman sürecin bir bellek görüntüyü içeren bir disk dosyası. Bu görüntü, programın sonlandırıldığı andaki durumunu incelemek için bir hata ayıklayıcıda (örneğin, gdb (1)) kullanılabilir. Bir işlemin çekirdeği boşaltmasına neden olan sinyallerin bir listesi sinyalde (7) bulunabilir.

...

Bir çekirdek dökümü dosyasının üretilmediği çeşitli durumlar vardır:

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

Ayrıca, madvise (2) MADV_DONTDUMP bayrağı kullanılmışsa, çekirdek dökümü, işlemin adres alanının bir kısmını hariç tutabilir.

Çekirdek döküm dosyalarının adlandırılması

Varsayılan olarak bir çekirdek dökümü dosyasına çekirdek adı verilir, ancak / proc / sys / kernel / core_pattern dosyası (Linux 2.6 ve 2.4.21'den beri) çekirdek dökümü dosyalarını adlandırmak için kullanılan bir şablonu tanımlamak üzere ayarlanabilir. Şablon, bir çekirdek dosya oluşturulduğunda aşağıdaki değerlerle değiştirilen% belirteçleri içerebilir:

       %%  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'da meydana gelen herhangi bir çökme / var / crash'a giriş yapar. Oluşturulan kilitlenme raporu bir araç uygulaması kullanılarak paketten çıkarılabilir

apport-unpack /var/crash/_crash_file.crash 'paketten çıkarma yolu'

ve daha sonra paketlenmemiş rapordaki çekirdek dökümü kullanılarak okunabilir

gdb 'cat ExecutablePath' CoreDump

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.