コアダンプされましたが、コアファイルは現在のディレクトリにありませんか?


277

Cプログラムの実行中に「(コアダンプ)」と表示されますが、現在のパスの下にファイルが表示されません。

私は設定して確認しましたulimit

ulimit -c unlimited 
ulimit -a 

「core」という名前のファイルも見つけようとしましたが、コアダンプファイルを取得できませんでしたか?
私のコアファイルはどこにありますか?


1
プログラムはある時点でchdirを呼び出しますか?もしそうなら、そこを見てください。
ウィリアムパーセル2010年

2
プログラムは作業ディレクトリを変更しますか?あっち見て。
Richard Pennington

ハードドライブ全体で最近のファイルを検索します;)
Hamish Grubijan、2010年

1
oops no not there ...私はそれをチェックしました..program chdir to / mntおよび/ iは両方のディレクトリをチェックしましたが、ファイルを見つけることができませんでした。/ -name "* core。"も見つけました。これでもファイルは表示されませんでした。それは、コア、第2の時間のために最初の時間との誤差= 101のためのアサーションエラー== 0前記ダンプ..値を挿入しながらプログラムは、C +のSQLiteのを使用する
webminal.org

8
はい、それで/proc/sys/kernel/core_pattern始まる文字列で上書きすると、/tmpコアダンプがそこに行きます。

回答:


240

/usr/src/linux/Documentation/sysctl/kernel.txtを読みます。

[/ proc / sys / kernel /] core_patternは、コアダンプファイルのパターン名を指定するために使用されます。

  • パターンの最初の文字が '|'の場合、カーネルはパターンの残りの部分を実行するコマンドとして扱います。コアダンプは、ファイルではなく、そのプログラムの標準入力に書き込まれます。

コアダンプをディスクに書き込む代わりに、システムはそれをabrtプログラムに送信するように構成されています。 自動化されたバグ報告ツールは、おそらく文書化されていないはずです...

いずれの場合も、迅速な答えは、あなたがあなたのコアファイルを見つけることができるはずということである/var/cache/abrtところ、abrt格納呼び出された後。同様に、Apportを使用する他のシステムは/var/crash、のコアをリスで削除する場合があります。


30
はい、次の内容でcore_patternを編集しましたecho "core。%e。%p"> / proc / sys / kernel / core_pattern ..nowは、現在のディレクトリ自体にコアダンプファイルを作成します。「core.giis.12344」などの名前で。回答/コメント/ヒントをありがとうございます。
webminal.org 2010年

20
fedora 18 abrtプログラムが/var/spool/abrt/代わりにコアダンプを格納していることに注意してください/var/cache/abrt
Nelson

4
誰もがシステム構成を使用する必要があるのではなく、ユーザーがこれを自分で構成できるようにする方法はありますか?
allyourcode 2013年

このコマンドを実行してプロセスを呼び出すと、標準出力と標準エラー出力はデフォルトで開かれませんか?とても奇妙なことが起こっているのが見えます。stderrおよびstdoutのdup2をカスタムファイル(applog.txt)に使用すると、他のファイル(mycore.BIN)に書き込んでいるデータが、stdoutおよびstderr(applog.txt)をキャッチするために使用したファイルにリダイレクトされます。 。これについては良い読み物はありますか?提案してください。ありがとう
mk .. 14

20
archlinuxのsystemdにコアダンプを格納/var/lib/systemd/coredump/
Francois

224

最近のUbuntu(私の場合は12.04)では、「セグメンテーション違反(コアダンプ)」が出力される可能性がありますが、コアファイルが期待どおりに生成されません(たとえば、ローカルでコンパイルされたプログラムの場合)。

これは、コアファイルサイズulimitが0の場合(まだ行っていない場合)に発生する可能性ulimit -c unlimitedがあります-これはUbuntuのデフォルトです。通常、それはあなたの間違いにあなたをcluing、「(コアダンプ)」抑制するだろうが、Ubuntuの上で、コアファイルがにパイプされApport経由(Ubuntuのクラッシュ報告システム)/proc/sys/kernel/core_pattern、これは誤解を招くメッセージを引き起こしているようです。

Apportが問題のプログラムがクラッシュを報告する必要のあるプログラムではないことを発見した場合(これはで発生することがわかります/var/log/apport.log)、コアファイルをCWDに配置するデフォルトのカーネル動作のシミュレーションにフォールバックします(これはスクリプトで行われます)/usr/share/apport/apport)。これには、ulimitを尊重することも含まれます。しかし(私はそう思います)カーネルに関する限り、corefileが生成され(そしてapportにパイプで送られ)、したがって「セグメンテーション違反(コアダンプ)」というメッセージが表示されます。

最終的にPEBKACはulimitの設定を忘れたためですが、この誤解を招くメッセージにより、しばらくの間、自分のコアファイルを何が食べているのかと気が狂ったように思いました。

(また、一般的には、core(5)のマニュアルページman 5 core--は、コアファイルがどこに行き着くか、およびコアファイルが書き込まれない理由についての優れたリファレンスです。)


4
どうもありがとうございました。同じ問題に遭遇しました。ところで、Ubuntu 14.04は、あなたが説明したのとまったく同じ動作を示します。
Malte Skoruppa、2015

5
Ubuntuのインストール(変更14.04)では、これを実行することで簡単な一時的な回避策がありますsudo service apport stop--- 実行した後/proc/sys/kernel/core_pattern、apportパイプから単にに変更されましたcore。Apportはcore_pattern一時的に修正するのに十分なほどスマートだと思います。
Patrick Collins、

6
「ulimit -c unlimited」はまさに私が必要とするものです-ありがとうございます!
Dave C

4
ulimitコマンドを実行した後、該当するすべての回答とすべてのコメントのすべての場所をここ
Nagev

2
@ElectricGoatいいえ、私はしていません。IMOはUXデザインが貧弱です。システムはパスを出力するだけであるか、作成されていない場合はメッセージを出力しないでください。これをさらに調査する機会が得られた場合は、独自の回答を追加します。
Nagev 2017

80

systemdのリリースに伴い、別のシナリオもあります。デフォルトでは、systemdはコアダンプをジャーナルに保存し、systemd-coredumpctlコマンドでアクセスできます。core_pattern-fileで定義:

$ 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


その "ハック"は(再起動後も)機能しませんでした。Arch Linuxを実行していますが、すでに実行していますulimit -c unlimited
gsingh2011 2013年

@ gsingh2011古くなっている可能性があります。Archはもう実行していないので、最近はうまくいくかどうかわかりません。あなたがそれを理解したら、新しいコメントで私/私たちを更新してください。
timss 2013年

5
@ gsingh2011の50-coredump.conf代わりに試してくださいcoredump.conf。これはオーバーライドする必要があります/lib/sysctl.d/50-coredump.conf。デフォルトは次の方法で復元できますsysctl -w kernel.core_pattern=core
Lekensteyn

これを機能させるには、アプリポートをオフにする必要がありましたsudo service apport stop
rahul003

51

Ubuntu 16.04 LTSでコアダンプを取得するための手順を書く:

  1. @jtnが彼の回答で述べたように、Ubuntuはクラッシュの表示をapportに委任し、プログラムはインストールされたパッケージではないため、ダンプの書き込みを拒否します。変更する前に

  2. この問題を解決するには、apportパッケージ以外のプログラムのコアダンプファイルも書き込むようにする必要があります。これを行うには、以下の内容で〜/ .config / apport / settingsという名前のファイルを作成します。
    [main] unpackaged=true

  3. 次に、プログラムを再度クラッシュさせて、*1000.crashのような名前のフォルダー/ var / crash内に生成されたクラッシュファイルを確認します。これらのファイルはgdbから直接読み取ることができないことに注意してください。変更後
  4. [オプション]ダンプをgdbで読み取り可能にするには、次のコマンドを実行します。

    apport-unpack <location_of_report> <target_directory>

参照: Core_dump – Oracle VM VirtualBox


3
これは、Ubuntu 18.04で私のために機能した唯一の解決策です
18年

〜/はどのユーザーに関係していますか?プロセスがrootによって実行されている場合、それは/root/.config/apport/settingsを意味しますか?
Nicholi

@Nicholiプログラムを実行したのはユーザーでなければならない。よくわかりません。
ankurrc

12

次の2つの可能性を考えることができます。

  1. 他の人がすでに指摘したように、プログラムはそうかもしれませんchdir()。プログラムを実行しているユーザーは、移動先のディレクトリへの書き込みを許可されchdir()ていますか?そうでない場合は、コアダンプを作成できません。

  2. 奇妙な理由で、コアダンプの名前が表示されません。それcore.*を確認でき/proc/sys/kernel/core_patternます。また、指定したfindコマンドでは、一般的なコアダンプは見つかりません。あなたは使うべきfind / -name "*core.*"コアダンプの代表的な名前があるとして、core.$PID


これが私のパターンです-これは、コアファイルがcore.pidではなく「PID.signal.userid」のような名前が付けられていることを意味しますか??? $ cat / proc / sys / kernel / core_pattern / usr / lib / hookCCpp / var / char / abrt%p%s%u
webminal.org

9

RHEL使用時にバイナリのコアダンプが見つからない場合はabrt/etc/abrt/abrt-action-save-package-data.conf

含む

ProcessUnpackaged = yes

これにより、インストールされたパッケージの一部ではないバイナリ(ローカルでビルドされたものなど)のクラッシュレポート(コアダンプを含む)を作成できます


6

fedora25の場合、コアファイルは次の場所にあります

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

ここでccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %、 `/ proc / sys / kernel / core_pattern 'に従って



5

Ubuntu18.04では、コアファイルを取得する最も簡単な方法は、apportサービスを停止するために以下のコマンドを入力することです。

sudo service apport stop

次に、アプリケーションを再実行すると、現在のディレクトリにダンプファイルが作成されます。


3

私はLinux Mint 19(Ubuntu 18ベース)を使用しています。coredump現在のフォルダにファイルを置きたかった。私は2つのことをしなければなりませんでした:

  1. 変更/proc/sys/kernel/core_pattern# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_patternまたは# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
  2. コアファイルサイズの制限を引き上げる $ ulimit -c unlimited

それはすでに回答に書かれていましたが、私は簡潔に要約するために書きました。興味深いことに、制限を変更してもroot権限は必要ありませんでした(/ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- rootは制限を下げることしかできないので、それは予想外でした-それに関するコメントは大歓迎です)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.