Cプログラムを実行している間、 "(core dumped)"と表示されますが、現在のパスの下にファイルがありません。
ulimit
を設定して検証しました。
ulimit -c unlimited
ulimit -a
私はまた、 "core"という名前のファイルを見つけようとしましたが、コアダンプファイルを取得できませんでしたか?
私のコアファイルはどこにありますか。
/usr/src/linux/Documentation/sysctl/kernel.txt を読んでください。
[/ proc/sys/kernel /] core_patternは、コアダンプファイルのパターン名を指定するために使用されます。
- パターンの最初の文字が '|'の場合、カーネルは残りのパターンを実行するコマンドとして扱います。コアダンプはファイルではなくそのプログラムの標準入力に書き込まれます。
コアダンプをディスクに書き込む代わりに、システムはそれをabrt
プログラムに送信するように設定されています。 自動バグ報告ツール は、おそらく文書化されていない / ...
いずれにせよ、素早い答えはあなたがあなたのコアファイルを/var/cache/abrt
で見つけることができるはずであるということです、そこで、abrt
はそれが呼び出された後それを格納します。同様に、 Apport を使用している他のシステムでは、/var/crash
のようにコアを追い払う可能性があります。
最近のUbuntu(私の場合は12.04)では、 "Segmentation fault(core dumped)"が表示される可能性がありますが、期待どおりにコアファイルが生成されないことがあります(たとえばローカルでコンパイルされたプログラムの場合)。
これは、コアファイルサイズのulimitが0の場合(ulimit -c unlimited
を実行していない場合)に発生する可能性があります - これはUbuntuのデフォルトです。通常、それは "(core dumped)"を抑制し、あなたをあなたの間違いに結びつけますが、Ubuntuではcorefilesは Apport にパイプされます(Ubuntuのクラッシュ報告システム/proc/sys/kernel/core_pattern
を介して、これは誤解を招くメッセージを引き起こすようです。
問題のプログラムがクラッシュを報告すべきものではないことがApportによって検出された場合(これは/var/log/apport.log
で起こっていることがわかります)、デフォルトのカーネルの振る舞いをcwdに入れることになります(これはスクリプト/usr/share/apport/apport
)。これはulimitを尊重することを含み、その場合それは何もしません。しかし、(私が思うに)カーネルに関する限り、コアファイルが生成され(そしてapportにパイプされ)、それゆえメッセージ "Segmentation fault(core dumped)"が表示されます。
究極的にはPEBKACは無制限に設定するのを忘れていましたが、誤解を招くメッセージは私がしばらくの間狂っていると思っていました。
(また、一般的に、core(5)マニュアルページ - man 5 core
- はあなたのコアファイルがどこで終わるかとそれが書かれないかもしれない理由のための良い参考文献です。)
systemd の発売に伴い、他にもシナリオがあります。デフォルトではsystemdはジャーナルにコアダンプを保存し、systemd-coredumpctl
コマンドでアクセス可能になります。 core_patternファイルに定義されています。
$ cat /proc/sys/kernel/core_pattern
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e
この振る舞いは単純な "ハック"で無効にすることができます。
$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core # or just reboot
いつものように、コアダンプのサイズは、例えばulimit -c unlimited
によって行われるように、ダンプされているコアのサイズと同じかそれ以上でなければなりません。
Ubuntu 16.04 LTSの下にコアダンプを取得するための命令を書く:
@jtnが彼の答えで述べたように、Ubuntuはクラッシュの表示をapportに委任しています。これはプログラムがインストールされたパッケージではないため、ダンプの書き込みを拒否します。
この問題を解決するには、apportが非パッケージプログラムにもコアダンプファイルを書き込むようにする必要があります。これを行うには、〜/ .config/apport/settingsという名前のファイルを次の内容で作成します。[main] unpackaged=true
(オプション)ダンプをgdbで読み取り可能にするには、次のコマンドを実行します。
apport-unpack <location_of_report> <target_directory>
次の2つの可能性が考えられます。
他の人がすでに指摘したように、プログラムはchdir()
かもしれません。プログラムを実行しているユーザは、chdir()
の書き込み先のディレクトリに書き込むことができますか?そうでない場合は、コアダンプを作成できません。
奇妙な理由でコアダンプの名前がcore.*
にならないあなたは/proc/sys/kernel/core_pattern
をチェックすることができます。また、あなたが命名したfindコマンドは典型的なコアダンプを見つけられないでしょう。コアダンプの一般的な名前はfind / -name "*core.*"
であるため、core.$PID
を使用する必要があります。
RHEL
上のバイナリのコアダンプが見当たらない場合、およびabrt
を使用する場合は、必ず/etc/abrt/abrt-action-save-package-data.conf
を使用してください。
含む
ProcessUnpackaged = yes
これはインストールされたパッケージの一部ではないバイナリのクラッシュレポート(コアダンプを含む)の作成を可能にします(例えばローカルでビルドされた)。
私のWSLへの取り組みは成功していません。
Linux用のWindowsサブシステム(WSL)で実行されている人たちにとって、現時点ではコアダンプファイルが見つからないという未解決の問題があるようです。
コメントはそれを示しています
これは私たちが認識している既知の問題です。調査中のものです。
Fedora25の場合、コアファイルは次の場所にあります。
/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump
/ proc/sys/kernel/core_patternによるccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %
ulimit -c unlimited
は、「コアダンプ」後にコアファイルが現在のディレクトリに正しく表示されるようにしました。