2012-03-22 6 views
0

64ビットLinuxシステム(RHEL5.5)でアプリケーションを実行しています(64ビットマシンでコンパイル)。このアプリケーションは、40〜50分後にクラッシュしています。32ビットマシンで同じコードを実行していたときに、これが完全に正常に動作していたのを見て驚いています。私のアプリケーションが64ビット用にコンパイルされて以来、segfaultを取得するのはなぜですか?

問題のあるシステムの空きメモリがわずか50 MBであることがわかりました。私は低メモリのためクラッシュしていると想定しました。しかし、そのシステムには約5 GBのキャッシュメモリがあります。このキャッシュメモリは私のメモリ要求のすべてに利用できるはずです。私はこの前提で正しいか、この問題を解決するためにしばらくしてからこのキャッシュを解放します。 カーネル:MyApplicationName [20655]:私のアプリケーションがクラッシュしたときのシステムログイン

私はメッセージを次見たセグメンテーション違反を0000000030363938 RIP 0000000000b35c7eのRSP 00000000f322a3a0エラーで4

誰もが問題がここにいることができるものを指すことができますか?このエラー4は、システム内のエラーを意味します。

#define EINTR   4  /* Interrupted system call */ 

しかし、あなたの問題は、メモリに、またはまったくこのエラー4に関連していないようです:

+1

RAMをアイドル状態にしておくことのポイントは何ですか?アプリケーションがそれを必要とするまで、それをキャッシュとして使うこともできます... –

答えて

1

エラー4は、それが/usr/include/asm-generic/errno-base.hでだ、EINTRです。おそらく、あなたのアプリケーションのコードが64ビットシステムのために準備されていなかったために現れたバグです。あなたの主な問題はerror 4ではなく、segfaultです。

セグメンテーションフォールトエラーは、アプリケーションがメモリを使用しようとしたときに使用できない、または使用権がないことです。この場合、カーネルはしばしばそれを止める以外の選択肢はありません。

このエラーの詳細については、アプリケーションをデバッグシンボルでコンパイルし、gdbをプロセスにアタッチし、segfaultがgdbシェルthread apply all btでこのコマンドで発生したときに完全なトレースを尋ねることができます。

+0

は、 'strace myprogram'を実行して、どのシステムコールがここでの犯人であるかを知ることができます。 – kch

0

キャッシュは必要なときに解放されます。問題ははるかにコード慣行が貧弱である可能性があります。可能であれば、すべてのintが32ビットと仮定してコードを作成します。

関連する問題