アプリケーション/スレッドに SIGSEGV==11 がある場合に、FreeBSD に強制的にコア ファイルを生成させることは可能ですか?
これを実行しているアプリケーションがありますが、それはスレッドの 1 つが死んでいるだけであり、実行可能ファイルは実行されたままです。
この実行可能ファイルはサービスとして実行されています - ファイルはどこにありますか? コア ファイルを強制的に /tmp などに表示させることはできますか?
ありがとう
探しているマンページは core(5) です。kern.corefile を、書き込みアクセス権があり、十分なスペースがあることが確実な場所に設定することをお勧めします。
なに
# sysctl kern.coredump
出力?0 の場合は、1 に設定する必要があります。つまり、
# sysctl kern.coredump=1
によるとman signal
、SIGSEGV は常にコア ファイルを生成する必要があります。
ただし、コア ファイルは現在の作業ディレクトリに生成されます。これは多くの場合、プロセスが開始されたときの作業ディレクトリです。そして、この振る舞いを変えることはできないと確信しています。一部のプログラムは、バイナリを起動する前に作業ディレクトリを変更するシェル スクリプトによって起動されるため、シェル スクリプトを変更することで影響を与えることができることに注意してください。
ハンドブックのデバッグ セクションによると、実行中のプロセスに GDB をアタッチすることもできます。
のような中央の場所でコア ファイルを収集したい場合は/tmp
、cron で次のように実行できます。
find ~ -name '*.core' -exec mv {} /tmp \;
Linux でこの問題が発生した場合、ulimit -c unlimited が設定されているかどうかを確認します。これは FreeBSD にも当てはまるかもしれません。これを参照してください: Linux C++ プログラムでコア ダンプを有効にする方法
強制終了するプロセスの pid を取得します。
ps -ef | grep プロセス名
次のようなものが得られます。
user PID TID 0 etc
kill -6 PID
プロセスが停止していることを確認し、これを再度実行してください。以前のようにプロセスが表示されることはありません。
ps -ef | grep PID
はい、これは可能です。
#include <sys/resource.h>
// core dumps may be disallowed by parent of this process; change that
struct rlimit core_limits;
core_limits.rlim_cur = core_limits.rlim_max = RLIM_INFINITY;
setrlimit(RLIMIT_CORE, &core_limits);
また、セットアップ システムのコアダンプ フォルダーを好む
# FreeBSD
mkdir -p /var/coredumps
chmod 777 /var/coredumps # for "kern.sugid_coredump=1"
sysctl kern.corefile=/var/coredumps/%U/%N.core
sysctl kern.coredump=1 # default
詳細については、core(5)およびsetrlimit(2)を参照してください。