どういう意味ですか?
参照AU:セグメンテーションフォールトは何ですか?また、これをどのように再現するかの例もあります。SO:セグメンテーション違反とは何ですか?。私が来ることができる最も簡単な説明(完璧ではないかもしれません):
プログラムは、独自のセクションの外側のメモリ領域にアクセスしようとしました。OSがブロックします。
いくつかの場合:初期化されたポインターで値を読み取る、配列の範囲外に出る、関数呼び出し(後方互換性が維持されない場合)、...
ただし、大規模なプログラムや他のプロジェクトライブラリを中継するプログラムで原因を見つけるのは必ずしも容易ではありません。そして、ほとんどの場合、ターゲットプログラムまたはその依存関係(アップストリームプロジェクトまたはダウンストリーム配布パッケージ)のいずれかに関するバグレポートが作成されます。
この問題を解決するにはどうすればよいですか?
カスタム構成/セットアップを行わず、すべての更新プログラムをインストールした場合。バグレポートを起動します。バグを報告するにはどうすればよいですか?を参照してください。
Ubuntuでサポートされているオープンソースの場合はubuntu-bug(apport-bug)を使用します。サードパーティのクローズドソースについては、バグの報告方法と関連データの収集方法についてヘルプページを確認してください。
注:プログラミングの背景が少しでもある場合は、自分で解決するために最善を尽くすことをお勧めします。何年もの間、多くのバグレポートが非アクティブになっています。または、少なくとも、報告する前に問題を解決するのに十分なデバッグデータを収集します。
デバッグに役立つツール
apport-bug ログ/コアダンプ/バックトレース
セグメンテーション違反の前にエラーメッセージがない場合。--saveオプションで実行し、バックトレースログを探します。
apport-bug program-cmd --save bug-report_output.txt
gdb バックトレース/デバッグソースコード
動作しなかった場合は、次を使用しますgdb。
$ gdb program-cmd
(gdb) run
(gdb) backtrace
エラーメッセージが表示された場合は、Web、Launchpad、およびアップストリームプロジェクトのバグトラッカーで同様のケースがあるかどうかを確認してください。
一部の上級ユーザーまたはac / c ++学習パスを使用している場合、対応する-dbgシンボルパッケージをダウンロードできます。次にgdb、ソースを使用してプログラムフローをトレースし、実行時エラーを発生させる正確な関数/命令を取得するために使用できます。
strace システムコールトレース
役立つかもしれないもう一つのツールはstrace、私はそれが好きです。それは本当に強力なツールです。
それ自身を提示します:
最も単純なケースでstraceは、指定されたコマンドを終了するまで実行します。プロセスによって呼び出されるシステムコールと、プロセスによって受信されるシグナルをインターセプトして記録します。各システムコールの名前、引数、および戻り値は、標準エラーまたは-oオプションで指定されたファイルに出力されます。
strace便利な診断、教育、およびデバッグツールです。システム管理者、診断者、およびトラブルシューティング担当者は、ソースを容易に入手できないプログラムを追跡するために再コンパイルする必要がないため、それらの問題を解決するのに非常に貴重であることがわかります。学生、ハッカー、好奇心the盛な人は、通常のプログラムをトレースするだけでも、システムとそのシステム呼び出しについて多くのことを学ぶことができます。また、プログラマーは、システムコールとシグナルがユーザー/カーネルインターフェイスで発生するイベントであるため、バグの分離、健全性チェック、および競合状態のキャプチャの試行にこの境界を詳しく調べると非常に便利です。
ソース: man strace
ltrace 動的ライブラリ呼び出しのトレース
ltraceは、指定されたコマンドを単に終了するまで実行するプログラムです。実行されたプロセスによって呼び出される動的ライブラリ呼び出しと、そのプロセスによって受信される信号をインターセプトして記録します。また、プログラムによって実行されるシステムコールをインターセプトおよび印刷できます。
その使用法はstrace(1)と非常に似ています。
ソース: man ltrace