Saat menjalankan program C, Dikatakan "(core dumped)" tapi saya tidak bisa melihat file di bawah jalur saat ini.
Saya telah menetapkan dan memverifikasi ulimit
:
ulimit -c unlimited
ulimit -a
Saya juga mencoba menemukan file bernama "core", tetapi tidak mendapatkan file inti yang dibuang?
Ada bantuan, di mana file inti saya?
/proc/sys/kernel/core_pattern
dengan string yang dimulai dengan/tmp
maka di situlah inti dump Anda akan pergi.Jawaban:
Baca /usr/src/linux/Documentation/sysctl/kernel.txt .
Alih-alih menulis dump inti ke disk, sistem Anda dikonfigurasi untuk mengirimkannya ke
abrt
program. Alat Pelaporan Bug Otomatis mungkin tidak terdokumentasi seperti seharusnya ...Bagaimanapun, jawaban cepatnya adalah Anda harus dapat menemukan file inti Anda
/var/cache/abrt
, tempatabrt
menyimpannya setelah dipanggil. Demikian pula, sistem lain yang menggunakan Apport dapat menyemprotkan inti/var/crash
, dan sebagainya.sumber
/var/spool/abrt/
bukannya/var/cache/abrt
/var/lib/systemd/coredump/
Pada Ubuntu baru-baru ini (12,04 dalam kasus saya), dimungkinkan untuk "Segmentasi fault (core dumped)" untuk dicetak, tetapi tidak ada file inti yang dihasilkan di mana Anda mungkin mengharapkan satu (misalnya untuk program yang dikompilasi secara lokal).
Ini dapat terjadi jika Anda memiliki ukuran file inti ulimit 0 (Anda belum melakukannya
ulimit -c unlimited
) - ini adalah default pada Ubuntu. Biasanya itu akan menekan "(core dumped)", membuat Anda salah, tetapi di Ubuntu, corefiles disalurkan ke Apport (sistem pelaporan kerusakan Ubuntu) via/proc/sys/kernel/core_pattern
, dan ini tampaknya menyebabkan pesan yang menyesatkan.Jika Apport menemukan bahwa program yang dimaksud bukan program yang seharusnya dilaporkan macet (yang dapat Anda lihat terjadi
/var/log/apport.log
), program kembali ke simulasi perilaku kernel default dengan meletakkan file inti di cwd (ini dilakukan dalam skrip/usr/share/apport/apport
). Ini termasuk menghormati ulimit, dalam hal ini tidak melakukan apa-apa. Tapi (saya berasumsi) sejauh menyangkut kernel, corefile dihasilkan (dan disalurkan ke apport), maka pesan "Segmentasi fault (core dumped)".Pada akhirnya PEBKAC karena lupa mengatur ulimit, tetapi pesan yang menyesatkan membuat saya berpikir saya akan menjadi gila untuk sementara waktu, bertanya-tanya apa yang memakan corefiles saya.
(Juga, secara umum, halaman manual inti (5) -
man 5 core
- adalah referensi yang bagus untuk tempat file inti Anda dan alasan mengapa itu tidak dapat ditulis.)sumber
sudo service apport stop
--- setelah saya jalankan itu, itu berubah/proc/sys/kernel/core_pattern
dari pipa apport menjadi adilcore
. Apport cukup pintar untuk memperbaikicore_pattern
sementara, saya kira.Dengan peluncuran systemd , ada skenario lain juga. Secara default systemd akan menyimpan dump inti dalam jurnal-nya, dapat diakses dengan
systemd-coredumpctl
perintah. Didefinisikan di file core_pattern:Perilaku ini dapat dinonaktifkan dengan "retasan" sederhana:
Seperti biasa, ukuran core dumps harus sama atau lebih tinggi dari ukuran core yang sedang dibuang, seperti yang dilakukan oleh misalnya
ulimit -c unlimited
.sumber
ulimit -c unlimited
.50-coredump.conf
alih-alihcoredump.conf
. Ini harus diganti/lib/sysctl.d/50-coredump.conf
. Default dapat dipulihkan dengansysctl -w kernel.core_pattern=core
sudo service apport stop
Instruksi penulisan untuk mendapatkan dump inti di bawah Ubuntu 16.04 LTS :
Seperti @jtn telah disebutkan dalam jawabannya, Ubuntu mendelegasikan tampilan crash ke apport , yang pada gilirannya menolak untuk menulis dump karena program ini bukan paket yang diinstal.
Untuk mengatasi masalah ini, kita perlu memastikan bahwa apport juga menulis file dump inti untuk program non-paket . Untuk melakukannya, buat file bernama ~ / .config / apport / settings dengan konten berikut:
[main] unpackaged=true
[Opsional] Agar dumps dapat dibaca oleh gdb, jalankan perintah berikut:
apport-unpack <location_of_report> <target_directory>
Referensi: Core_dump - Oracle VM VirtualBox
sumber
Saya bisa memikirkan dua kemungkinan berikut:
Seperti orang lain sudah tunjukkan, programnya mungkin
chdir()
. Apakah pengguna yang menjalankan program diizinkan untuk menulis ke dalam direktori yang menjadichdir()
tujuannya? Jika tidak, itu tidak dapat membuat dump inti.Untuk beberapa alasan aneh, dump inti tidak bernama
core.*
Anda dapat memeriksa/proc/sys/kernel/core_pattern
itu. Juga, perintah find yang Anda beri nama tidak akan menemukan dump inti khas. Anda harus menggunakanfind / -name "*core.*"
, karena nama khas dari coredump adalahcore.$PID
sumber
Jika Anda kehilangan core dump untuk binari
RHEL
dan saat menggunakanabrt
, pastikan itu/etc/abrt/abrt-action-save-package-data.conf
mengandung
Ini memungkinkan pembuatan laporan kerusakan (termasuk dump inti) untuk binari yang bukan bagian dari paket yang diinstal (misalnya dibuat secara lokal).
sumber
Untuk fedora25, saya dapat menemukan file inti di
di mana
ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %
sesuai `/ proc / sys / kernel / core_pattern 'sumber
Upaya saya di WSL tidak berhasil.
Bagi mereka yang menjalankan Windows Subsystem untuk Linux (WSL) tampaknya ada masalah terbuka saat ini untuk file core dump yang hilang.
Komentar menunjukkan itu
Masalah Github
Umpan Balik Pengembang Windows
sumber
Di Ubuntu18.04, cara paling mudah untuk mendapatkan file inti adalah dengan memasukkan perintah di bawah ini untuk menghentikan layanan apport.
Kemudian jalankan kembali aplikasi, Anda akan mendapatkan file dump di direktori saat ini.
sumber
Saya menggunakan Linux Mint 19 (berbasis Ubuntu 18). Saya ingin memiliki
coredump
file di folder saat ini. Saya harus melakukan dua hal:/proc/sys/kernel/core_pattern
(oleh# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_pattern
atau oleh# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
$ ulimit -c unlimited
Itu sudah tertulis dalam jawaban, tetapi saya menulis untuk meringkas secara ringkas. Batas perubahan yang menarik tidak memerlukan hak akses root (sesuai /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root hanya dapat menurunkan batas, jadi itu tidak terduga - komentar tentangnya diterima).
sumber
ulimit -c unlimited
membuat file inti muncul dengan benar di direktori saat ini setelah "core dumped".sumber