セグメンテーション違反とは何ですか?


27

Ubuntuでは、セグメンテーション違反エラーに何度も直面しています。セグメンテーション違反とは何ですか?いつ発生しますか?


1
ちょうどそれをカバーするために:私は同様の問題を抱えていましたが、私のセグメンテーション違反は確実に再現可能ではなく、それらは(ほぼ)ランダムなアプリケーションから来ました。私の記憶が壊れている可能性が高いことがわかりました。そのため、プログラムによってセグメンテーション違反が発生する場合は、RAMを詳しく調べる必要があります。

回答:


25

エラー言ってセグメンテーションフォールト(またはセグメンテーションフォルトを、またはSIGSEGV)Ubuntuと他のUnixライクなオペレーティングシステムで、または言って一般保護違反時にプログラムにアクセスすることができませんメモリの一部にアクセスしようとする試み、またはそのプログラムのWindowsでは、ありますアクセスできません。セグメンテーションフォールトは、プログラムクラッシュの一種、つまりプログラムの異常終了です。詳細については、クラッシュメモリ保護セグメンテーション違反一般保護違反、およびSIGSEGVに関するWikipediaの記事を参照してください(および、ここで提示されているものよりもトピックに関するテクスチャの理解が深い)。

セグメンテーション違反は、ほとんどの場合、それが発生するプログラムのバグが原因です。セグメンテーション違反のほとんどまたはすべてが同じアプリケーションから発生していると推測しています。マシン上でセグメンテーション違反が発生している状況、およびクラッシュしているプログラムについて詳しく説明してください。また、受け取ったエラーメッセージの完全かつ正確なテキストと、その前に表示されるその他のメッセージも提供してください。これにより、(セグメンテーション障害とは何かに関する一般的な情報ではなく)問題に固有の詳細なアドバイスを提供できるようになります。

この情報を提供する最良の方法は、質問を編集してそれを含めることです。あるいは、この質問を一般的なセグメンテーション違反のみにしたい場合は、セグメンテーション違反の具体的な原因について質問するために新しい質問を投稿できます(これを行う場合は、新しい質問にこれらすべての詳細を必ず入力してください) 。


幸いなことに、すべてのセグメンテーション違反はosをアップグレードすることで修正されます:) 私の質問は、一般的なセグメンテーション違反に関するものです。特定のアプリではありません。
タキオン

@ I'mnotthisperson私はそれに応じて答えを編集しました。(セグメンテーション違反を経験している他のユーザーの利益のために、現在、特定の支援を必要としないことを知っているにもかかわらず、より多くの情報を提供するための指示を保持しています。)
エリアカガン

さて、これはアプリのセグメンテーション違反についてです。同じプログラムがWindowsまたはTurbo C ++(ワインで)で完全に実行される(私はLinuxでanjutaを使用する)C ++プログラムで発生することについて尋ねたかったのですが、これらはアプリケーションではなく基本的なプログラムです(TREESのようなプログラム、グラフなど)
ニルミック

ありがとう。しかし、私はアプリのセグメンテーション違反について質問するほとんどの場合、ここではオフトピックであると恐れています。:)
タキオン

@Nirmik:おそらくstackoverflowのトピックです:)
Tachyons

4

セグメンテーション違反は、アプリケーションのバグが原因です。技術的には、アプリケーションがメモリに属さない(または存在しない)メモリの一部に対して読み取りまたは書き込みを試みることを意味します。もちろん、他の誰かのメモリを読み書きすることは禁じられており、システム(カーネル)がこれを検出すると、アプリケーションを強制終了します。


0

アセンブリコードをトレースして問題をデバッグするために使用されていた時代は過ぎ去りました。異常終了、ワトソン博士、セグメンテーション違反。それらの緑の日は過ぎ去りました。

セグメンテーションフォールトの理由の1つは、メモリに直接アクセスするコードが失敗することです。コードが別のアプリケーションのメモリセグメントにアクセスしようとすると、セグメンテーションエラーが発生します。メモリの割り当ては、より大きな連続したメモリブロックが割り当てられるように移動される場合があります。カーネルは回復を試みますが、メモリ情報をすべてファイルに保存し、CPUで実行されているすべてのアプリケーションの現在の状態とその状態(最後の命令実行)をファイルに保存しようとします。また、回復情報をできるだけ多く保存し、できる限り多くのファイルを閉じようとするため、hddがリンク切れにならないようにします。

頻繁に再現できる場合は、デバッグして修正してください。再現できない場合は、手をつないでひざまずいて、「定期的に」見えないように地獄のように祈ってください。


セグメンテーション違反は、直接メモリアクセスを許可する言語で記述されたプログラムでトリガーできます。通常、カーネルもクラッシュしません。
アレックスL.

@AlexL。それは正確です。答えを編集します。
シッダールス

自分の考えを正しく表したことを願っています。
シッダールト

@AlexL。もう一度確認してください。それでも正確でない場合は削除します。
シッダールス

これの方が良い。それでも、(1)可能ですが、プログラムがSIGSEGVハンドラをSIG_DFL(コアをダンプして終了するSIGSEGV)以外に設定することは非常にまれです間違っており、回復はおそらく不可能です。(2)プロセスが停止されると、コアがダンプされます。(3)コアダンプには、ダンプされたプロセスのメモリとレジスタのみが含まれます。(4)他のプロセス、CPUおよびカーネルは、別のプロセスのセグメンテーション違反の影響を受けません。
アレックスL.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.