Çekirdek boşaltıldı, ancak çekirdek dosya geçerli dizinde değil mi?


277

Bir C programı çalıştırırken, "(core dumped)" yazıyor ama geçerli yolun altında herhangi bir dosya göremiyorum.

Ayarladım ve doğruladım ulimit:

ulimit -c unlimited 
ulimit -a 

Ayrıca "core" adlı bir dosyayı bulmaya çalıştım, ancak core dumped dosyasını alamadım?
Herhangi bir yardım, çekirdek dosyam nerede?


1
Program bir noktada chdir'i çağırıyor mu? Eğer öyleyse, oraya bak.
William Pursell

2
Program çalışma dizinini değiştiriyor mu? Oraya bak.
Richard Pennington

Tüm sabit disk
sürücüsünü

1
oops hayır onun orada değil ... Ben kontrol .. program chdir için / mnt ve / i her iki dizin kontrol ama dosyayı bulamadı. / -Name "* core" bile buldum. bu bile bana dosyayı göstermedi. Program C + sqlite kullanır, çekirdek dökümlerini eklerken değer ilk kez hata == 0 ve ikinci kez hata = 101
dedi

8
Evet, /proc/sys/kernel/core_patternile başlayan bir dize ile geçersiz kılarsanız /tmp, çekirdek dökümleriniz bu noktada olacaktır.
ephemient

Yanıtlar:


240

/Usr/src/linux/Documentation/sysctl/kernel.txt dosyasını okuyun .

[/ 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 görür. Çekirdek dökümü, bir program yerine o programın standart girdisine yazılır.

Çekirdek dökümü diske yazmak yerine, sisteminiz abrtbunun yerine programa gönderilecek şekilde yapılandırılmıştır . Otomatik Hata Raporlama Aracı olması gerektiği gibi belgelenmemiş ...

Her durumda, hızlı yanıt, çekirdek dosyanızı /var/cache/abrt, abrtçağrıldıktan sonra sakladığı yerde bulabilmenizdir . Benzer şekilde, Apport kullanan diğer sistemler, çekirdekler /var/crashvb.


30
evet, aşağıdaki içerik yankı "çekirdek.% e.% p"> / proc / sys / kernel / core_pattern .. ile core_pattern düzenledim şimdi geçerli dizinde çekirdek döküm dosyasını oluşturur. adıyla "core.giis.12344" vb. Cevaplarınız / yorumlarınız / önerileriniz için hepinize teşekkür ederim.
webminal.org

20
Sadece fedora 18 abrt programının /var/spool/abrt/yerine çekirdek dökümlerini sakladığını not etmek için/var/cache/abrt
Nelson

4
Kullanıcıların bunu sistem yapılandırmasını kullanmak zorunda kalmak yerine, kendileri için yapılandırmasına izin vermenin bir yolu var mı?
allyourcode

Bu komut çalıştırıldığında ve işlem çağrıldığında, stdout ve stderr varsayılan olarak açılmaz mı? Çok garip şeyler oluyor. benim özel dosya (applog.txt) içine stderr ve stdout dup2 kullandığımda, başka bir dosya (mycore.BIN) yazıyorum veri stdout & stderr (applog.txt) yakalamak için kullandığınız dosyaya yönlendiriliyor . Bu konuda iyi bir okuma var mı? Lütfen önerin. Thank you
mk ..

20
archlinux mağazasında systemd coredumps/var/lib/systemd/coredump/
Francois

224

Son Ubuntu'da (benim durumumda 12.04), "Segmentasyon hatası (çekirdek dökümü)" yazdırılabilir, ancak beklediğiniz yerde (örneğin yerel olarak derlenmiş bir program için) hiçbir çekirdek dosya üretilmez.

Bu, çekirdek dosya boyutu ulimit 0 ise (henüz yapmadıysanız ulimit -c unlimited) olabilir - bu Ubuntu'daki varsayılan değerdir. Normalde bu, "(çekirdek dökümü)" 'nü bastırarak sizi hataya düşürür, ancak Ubuntu'da, çekirdek dosyaları Apport'a (Ubuntu'nun çökme raporlama sistemi) üzerinden gönderilir /proc/sys/kernel/core_patternve bu yanıltıcı iletiye neden olur.

Apport, söz konusu programın çökmeleri bildirmesi gereken bir program olmadığını (bunun içinde olduğunu görebilirsiniz /var/log/apport.log) keşfederse, cwd'ye bir çekirdek dosya koymak için varsayılan çekirdek davranışını simüle etmeye geri döner (bu kodda yapılır /usr/share/apport/apport). Bu ulimit onurlandırmayı içerir, bu durumda hiçbir şey yapmaz. Ancak (sanırım), çekirdek söz konusu olduğunda, bir çekirdek dosyası oluşturuldu (ve ayırmak için pipetlendi), böylece "Segmentasyon hatası (çekirdek dökümü)" mesajı.

Nihayetinde PEBKAC ulimit kurmayı unuttuğu için, ama yanıltıcı mesaj bana bir süre delirdiğimi ve çekirdek dosyalarımı ne yediğini merak ettiğimi düşündürdü.

(Ayrıca, genel olarak, çekirdek (5) manuel sayfa - man 5 core- çekirdek dosyanızın nerede bittiği ve yazılmamasının nedenleri için iyi bir referanstır.)


4
Çok teşekkür ederim - aynı problemle karşılaştım. Btw, Ubuntu 14.04, tanımladığınız davranışla tamamen aynı davranışı sergiliyor.
Malte Skoruppa

5
Ubuntu kurulumumda (değiştirilmiş 14.04), çalıştırarak bunun için geçici bir geçici çözüm var sudo service apport stop--- bunu çalıştırdıktan sonra /proc/sys/kernel/core_pattern, apport borusundan sadece değiştirildi core. Apport, core_patterngeçici olarak düzeltmek için yeterince akıllı .
Patrick Collins

6
"ulimit -c sınırsız" tam olarak ihtiyacım olan şey - Teşekkür ederim!
Dave C

4
Ulimit komutunu yaptıktan sonra her bir cevabı ve her
yorumdaki

2
@ElectricGoat Hayır yapmadım. Kötü UX tasarımı, IMO. Sistem sadece yolu yazdırmalı veya oluşturulmamışsa hiç bir mesaj yazdırmamalıdır. Bunu daha fazla araştırma şansı bulduğumda veya bulduğumda kendime cevap vereceğim.
Nagev

80

Systemd'ın piyasaya sürülmesiyle birlikte başka bir senaryo daha var. Varsayılan olarak systemd, systemd-coredumpctlkomutla erişilebilen çekirdek dökümlerini günlüğüne kaydeder . Core_pattern dosyasında tanımlanmıştır:

$ cat /proc/sys/kernel/core_pattern 
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e

Bu davranış, basit bir "kesmek" ile devre dışı bırakılabilir:

$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core      # or just reboot

Her zaman olduğu gibi, çekirdek döküntülerinin boyutu, örneğin yapıldığı gibi, dökülen çekirdeğin boyutuna eşit veya daha yüksek olmalıdır ulimit -c unlimited.


Bu "hack" benim için işe yaramadı (yeniden başlatmadan sonra bile). Arch Linux çalıştırıyorum ve zaten çalıştırıyorum ulimit -c unlimited.
gsingh2011

@ gsingh2011 Eski olabilir. Artık Arch'ı çalıştırmıyorum, bu yüzden bugünlerde işe yarayıp yaramayacağını söyleyemem. Bunu anlarsanız, beni / bizi yeni bir yorumla güncellemekten çekinmeyin.
timss

5
@ deneyin gsingh2011 50-coredump.confyerine coredump.conf. Bu geçersiz kılınmalıdır /lib/sysctl.d/50-coredump.conf. Varsayılan sysctl -w kernel.core_pattern=core
ayar

Bunun için appport kapatmak zorunda kaldısudo service apport stop
rahul003

51

Ubuntu 16.04 LTS altında bir çekirdek dökümü almak için yazma talimatları :

  1. @Jtn'nin cevabında belirttiği gibi, Ubuntu , programın yüklü bir paket olmadığı için dökümü yazmayı reddeden, çökmelere ilişkin görüntüyü apport'a devreder .Değişiklik yapmadan önce

  2. Sorunu çözmek için apport'un paket olmayan programlar için de temel döküm dosyaları yazdığından emin olmalıyız . Bunu yapmak için, aşağıdaki içeriğe sahip ~ / .config / apport / settings adlı bir dosya oluşturun :
    [main] unpackaged=true

  3. Şimdi programınızı tekrar kilitleyin ve * .1000.crash gibi adlarla kilitlenme dosyalarınızın şu klasörde oluşturulduğunu görün: / var / crash . Bu dosyaların doğrudan gdb tarafından okunamayacağını unutmayın .Değişiklik yaptıktan sonra
  4. [İsteğe bağlı] Dökümleri gdb tarafından okunabilir hale getirmek için aşağıdaki komutu çalıştırın:

    apport-unpack <location_of_report> <target_directory>

Referanslar: Core_dump - Oracle VM VirtualBox


3
Bu benim için Ubuntu
18.04'te

~ / Hangi kullanıcı ile ilgilidir? İşlem kök tarafından yürütülüyorsa, bu /root/.config/apport/settings anlamına mı geliyor?
Nicholi

@Nicholi Programı yürüten kullanıcı olması gerektiğine inanıyorum. Yine de emin değilim.
ankurrc

12

Aşağıdaki iki olasılığı düşünebilirim:

  1. Diğerlerinin de belirttiği gibi, program olabilir chdir(). Programı çalıştıran kullanıcının kurduğu dizine yazmasına izin veriliyor chdir()mu? Değilse, çekirdek dökümü oluşturamaz.

  2. Bazı tuhaf nedenlerden ötürü, çekirdek dökümü adlandırılmadı core.*Bunu kontrol edebilirsiniz /proc/sys/kernel/core_pattern. Ayrıca, adlandırdığınız find komutu tipik bir çekirdek dökümü bulamaz. Sen kullanmalıdır find / -name "*core.*"coredump tipik adıdır olarak,core.$PID


İşte benim desen - bu çekirdek dosya çekirdek.pid yerine "PID.signal.userid" gibi bir şey adlandırılır mı ??? $ cat / proc / sys / çekirdek / core_pattern / usr / lib / hookCCpp / var / char / abrt% p% s% u
webminal.org

9

RHELKullanırken ve kullanırken ikili dosyalar için çekirdek dökümlerini kaçırıyorsanız abrt,/etc/abrt/abrt-action-save-package-data.conf

içeren

ProcessUnpackaged = yes

Bu, kurulu paketlerin bir parçası olmayan (örn. Yerel olarak oluşturulmuş) ikili dosyalar için kilitlenme raporlarının (çekirdek dökümleri dahil ) oluşturulmasını sağlar.


6

Fedora25 için, çekirdek dosyayı bulabilirim

/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump

burada ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %`/ proc / sys / çekirdek / core_pattern' göre



5

Ubuntu18.04'te çekirdek bir dosyayı almanın en kolay yolu apport hizmetini durdurmak için aşağıdaki komutu girmektir.

sudo service apport stop

Sonra uygulamayı yeniden çalıştırın, döküm dizini geçerli dizinde alırsınız.


3

Linux Mint 19 kullanıyorum (Ubuntu 18 tabanlı). coredumpGeçerli klasörde dosya olmasını istedim . İki şey yapmak zorunda kaldım:

  1. Değiştir /proc/sys/kernel/core_pattern( # echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_patternveya# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
  2. Çekirdek dosya boyutu için sınırı yükseltme $ ulimit -c unlimited

Bu zaten cevaplarda yazılmıştır, ancak özlü bir şekilde özetlemek için yazdım. İlginç bir şekilde değişen sınır, kök ayrıcalıkları gerektirmedi ( /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root sadece sınırı düşürebilir, bu yüzden beklenmedikti - bu konuda yorumlarınızı bekliyoruz).


2

ulimit -c unlimited "çekirdek dökümü" nün ardından çekirdek dosyanın geçerli dizinde doğru görünmesini sağladı.

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.