13

現在、SEGV をキャッチして内部情報をファイルにダンプするサーバー (C および C++ で作成) があります。コア ファイルを生成し、SEGV をキャッチした時点でそれをディスクに書き込みたいと考えています。これにより、サポート担当者と顧客は、コアを取得するために ulimit に悩まされ、クラッシュが再び発生するのを待つ必要がなくなります。ファイル。過去に中止機能を使用しましたが、ulimit ルールの対象となり、役に立ちません。

/proc/pid/map を読み取ってコア ファイルを手動で生成するレガシー コードがいくつかありますが、それは古く、あまり移植性がないようです (たとえば、64 ビットでは動作しないと推測しています)。ビルドします)。Linux プロセスでコア ファイルを生成してダンプする最良の方法は何ですか?

4

8 に答える 8

9

Google には、 google-coredumperと呼ばれる実行中のプロセス内からコアダンプを生成するためのライブラリがあります。これは、ulimit およびその他のメカニズムを無視する必要があります。

コア ファイルを生成する呼び出しのドキュメントはこちらです。ドキュメントによると、シグナル ハンドラでコア ファイルを生成することは可能であると思われますが、常に機能するとは限りません。

于 2008-12-03T18:47:22.850 に答える
5

私はpmbrett の投稿を見て、「これはクールだ」と思いましたが、私のシステム (Gentoo) のどこにもそのユーティリティを見つけることができませんでした。

だから私はちょっとしたことをしました、そしてGDBにはこのオプションがあることを発見しました。

gdb --pid=4049 --batch -ex gcore

私にとってはうまくいったようです。

ただし、その時点で使用されていた最も低い機能をトラップするため、あまり有用ではありませんが、それ以外でも適切に機能します (メモリ制限なしで、firefox プロセスのダンプされた 350M スナップショット)。

于 2008-11-29T17:37:26.550 に答える
4

Linux コマンド gcore を使用してみてください

使用法: gcore [-o ファイル名] pid

システム (または exec) と getpid() を使用して、プロセス内から呼び出すための適切なコマンド ラインを構築する必要があります。

于 2008-11-29T01:38:46.063 に答える
3

この状況に対処するいくつかの可能な解決策:

  1. ulimitを修正!!!
  2. コア ファイルを取得せず、gdb 内で実行しないことを受け入れ、SIGSEGV で "thread all apply bt" を実行するようにスクリプト化します。
  3. コア ファイルを取得しないことを受け入れ、アプリケーション内からスタック トレースを取得します。プログラム内のスタック バックトレースの記事はかなり古いものですが、最近でも可能になっているはずです。
于 2008-11-25T21:05:33.353 に答える
2

setrlimit(2) を使用して、プログラム内から ulimit() を変更することもできます。ulimit シェル コマンドと同様に、ハード リミットが許す限り制限を下げたり上げたりすることができます。起動時に setrlimit() を実行してコア ダンプを許可すれば問題ありません。

于 2008-12-30T11:51:23.967 に答える
2

たとえば、SEGV をキャッチし、メッセージを出力して _exit() を呼び出すようなシグナル ハンドラがあるとします。(そうしないと、そもそもコア ファイルができてしまいます!) 次のようなことができます。

void my_handler(int sig)
{
   ...
   if (wantCore_ && !fork()) {
      setrlimit(...);  // ulimit -Sc unlimited
      sigset(sig, SIG_DFL);  // reset default handler
      raise(sig);  // doesn't return, generates a core file
   }
   _exit(1);
}
于 2011-09-07T19:33:49.167 に答える
1

backtrace および backtrace_symbols glibc 呼び出しを使用してトレースを取得します。backtrace_symbols は内部で malloc を使用し、ヒープが破損している場合は失敗する可能性があることに注意してください。

于 2010-11-11T17:10:28.827 に答える
0

システム ("kill -6")

まだ探しているものがあれば試してみます

于 2009-03-27T04:16:43.830 に答える