特定のセットの条件が満たされると、OS によってコア ダンプが生成されることに注意してください。これらの条件は、マップされていないメモリにアクセスしようとしたり、CPU が認識していないオペコードを実行しようとしたりするなど、非常に低レベルです。Linux などの POSIX オペレーティング システムでは、プロセスがこれらのいずれかを実行すると、適切なシグナルがそれ、およびそれらのいくつかは、プロセスによって処理されない場合、コアダンプを生成するデフォルトのアクションを持ちます。これは、特定の制限を設定することによって禁止されていない場合、OS によって行われます。
この機械は可能な限り低いレベル (マシンコード) でプロセスを処理しますが、Go コンパイラが生成するバイナリは、C コンパイラ (またはアセンブラ) が生成するバイナリよりも高レベルであり、これは生成されたプロセスで特定のエラーが発生することを意味します。 Go コンパイラによる処理は、OS ではなく Go ランタイムによって処理されます。たとえば、C コンパイラによって生成されたプロセスでの典型的な NULL ポインターの逆参照は、通常、プロセスに SIGSEGV シグナルを送信することになり、通常、プロセスのコアをダンプして終了しようとします。対照的に、Go コンパイラによってコンパイルされたプロセスでこれが発生すると、Go ランタイムが起動してパニックになり、デバッグ用の適切なスタック トレースが生成されます。
これらの事実を念頭に置いて、私はこれをやろうとします:
- 最初にコア ダンプの制限を緩和し (ただし、以下を参照)、標準エラー ストリームをファイルにリダイレクト (または
logger
バイナリなどにパイプ) してプログラムを実行するシェル スクリプトでプログラムをラップします。
- ユーザーが微調整できる制限には階層があります。ソフト制限とハード制限があります。説明については、これとこれを参照してください。システムのコア ダンプ サイズがハード リミットとして 0 に設定されていないことを確認してください。
- 少なくとも私の Debian システムでは、SIGSEGV が原因でプログラムが停止した場合、この事実はカーネルによってログに記録され、syslog ログ ファイルに表示されるため、ヒントを得るためにそれらを grep してみてください。