Linuxでのセグメンテーションエラーについて
2011/8/319:05:07
Linuxでのセグメンテーションエラーについて
プログラムのデバッグ作業をしていたのですが、セグメンテーションエラーで詰まってしまいました。
OSはWindows、開発環境はVC++です。
windowsの場合だと、確保していない領域に書き込んでも、エラーを出してくれなかったりするのでデバッグが難しいです。
しかしここで、Linuxならばセグメンテーションエラーに対しては必ずエラーを出してくれるという情報を聞きました。
そこで、開発環境をLinuxに移すことにしました。ところが、明らかにセグメンテーションエラーであるのに、エラーを一切吐き出してくれません。
今のLinuxはセグメンテーションエラーに必ずエラーを出してくれるというわけではないのでしょうか?
ちなみにLinixでの開発環境は以下の通りです。
OS: Ubuntu10.04(server版)
コンパイラー g++, icc
一応以下の簡単なコードでもテストしました。
#include<stdio.h>
int mani(){
int a[3];
a[10]=99;
printf("%d\n",a[10]);
return 0;
}
実行結果
99
a[10]は確保されていないのでエラーが出てほしいのですが・・・
ベストアンサーに選ばれた回答
編集あり2011/8/400:19:20
> windowsの場合だと、確保していない領域に書き込んでも、エラーを出してくれなかったりするのでデバッグが難しいです。
Linuxでも同じですよ。プロセスが確保していない領域に書き込んだら多くの場合エラーを出してくれるでしょうけど、あなたがC言語で配列を確保していないことはプロセスがメモリを確保していないことを意味しないし、そもそもC言語はもとより添え字の範囲を静的にも動的にもチェックしない言語です。しかたないから、静的/動的なチェッカを使うのですよ。
gcc は mudflap という動的チェック機構を内蔵しています。内蔵してるんだけど、ディストリビューションによってはそのコンパイル/実行に必要な補助ライブラリが別パッケージになってるだろうから、必要に応じて libmudflap-dev とかをインストールして使ってくださいな。
$ gcc a.c -Wall -fmudflap -lmudflap
$ ./a.out
*******
mudflap violation 1 (check/write): time=1312375766.383213 ptr=0x7fffd83b31e0 size=44
pc=0x7f71ecfb7cc1 location=`a.c:6:1 (main)'
/usr/lib/libmudflap.so.0(__mf_check+0x41) [0x7f71ecfb7cc1]
./a.out(main+0x90) [0x400a74]
/lib/libc.so.6(__libc_start_main+0xfd) [0x7f71ecc6bc4d]
Nearby object 1: checked region begins 0B into and ends 32B after
mudflap object 0xb50560: name=`a.c:4:5 (main) a'
bounds=[0x7fffd83b31e0,0x7fffd83b31eb] size=12 area=stack check=0r/3w liveness=3
alloc time=1312375766.383198 pc=0x7f71ecfb7431
number of nearby objects: 1
*******
mudflap violation 2 (check/read): time=1312375766.383972 ptr=0x7fffd83b31e0 size=44
pc=0x7f71ecfb7cc1 location=`a.c:7:1 (main)'
セグメンテーション違反です
ちゃんと、4行めのオブジェクト a に関する違反を二つ、6行め(a[10]=99)と 7行目(a[10]) で指摘してセグメンテーションフォールトでおちます。
メモリ関係なら伝統的な efence とか varglind とかのもっと大きなシステムもありますから、必要に応じて検討してみてくださいな。
- Yahoo!検索で調べてみよう
ベストアンサー以外の回答
1〜3件/3件中
- 並び替え:回答日時の
- 新しい順
- |古い順
ycos001さん
2011/8/423:24:07
質問の真意が分かりませんが、文面から察するとセグメンテーションエラーそのものではなく、メモリーリーク等の設計上の問題があり、それを特定するために環境を変えたという事でしょうか?
既にセグメンテーションエラーや各種コンパイル方法については、回答がいくつか投稿されているので上記の前提で投稿します。
単純な配列についてのチェックは難しいです。やはりコンパイルオプションの調整や efence などのツールが必要でしょう。
過去のプロジェクトでよくやった方法はとしては、malloc/free 相当の関数を作成しその中で上下限のチェック、初期化、解放の有無等をチェックしていました。動作が安定してくれば、オリジナルの malloc/free に定義しなおし、パフォーマンスに対応していました。
ありがちな手法ですが、ご参考まで。
参考URL
http://msdn.microsoft.com/ja-jp/library/dd313966.aspx
2011/8/415:13:39
2011/8/400:30:48
関数内で定義された変数は、オート変数とか自動変数とか呼びますが、
スタック・セグメント上に、領域が、確保される変数です。
スタック・セグメントは、プログラムの起動時に、
システム所定の大きさだけ確保されますから、
その範囲内であれば、セグメンテーション・エラーにはなりません。
ただし、スタックに書き込むことは、
スタックに保存されている、情報が、破壊されることが、あるため、
プログラムの誤動作を招き、main () を呼んでいる、
さらに、上位の処理系の情報が、破壊されかねません。
10 ではなく、もっと、大きな数字にすれば、
重要な領域を破壊することも無く、
所望のエラーが、発生するはずです。
少しずつ大きくしていけば、セグメントの最終が、分かります。
あわせて知りたい
- セグメンテーション違反と出ます。原因が分からないので教えてください!! ちな...
- 簡単なソースですが、セグメンテーション違反で失敗 strcatやsprintfを勉強したの...
- C言語でセグメンテーション違反が出て困っています。 今まで普通に動いていたプ...
- 現在,opencv (ver2.4.1)を使ってカメラから読み込んだ画像を用いてエッジ抽出を...
- C言語プログラムの変更で困っています。 FIRの畳み込みのプログラムを手に入れ...
- 就活でネクタイのディンプルは作ったらダメなんですか? 調べてみると意見が分か...
- Edubuntu 14.04.3 LTS で音が出ません。 web閲覧はできるのですが、音声が出ませ...
- 中国に二つ目のディズニーランドが上海に 2012年開業なんですね 恐るべし中国...
- VisualC++でダイアログを表示しようとする所でエラーが出てしまいます。 error C2...
- cobolのsearch文とテーブルの使い道・使い方がよくわかりません。 具体的な使用例...
- TAB譜の読み方について質問です。 シドの妄想日記のギターソロにあたる部分なの...
- Fortranについて・・・。 簡単なプログラミングを書いたのですがエラーが出てし...
- DOSのfindは子フォルダの中のファイルは検索できないのでしょうか?
- macアドレスの変更って 12桁の16進数ならなんでもokなんでしょうか 回答おまち...
- 数学で質問です 空間ベクトルについてなんですが aベクトル(1、-1、0) bベクト...
- 半角カタカナの濁点について質問です。 半角カタカナの濁点について質問です。 ...
- AdobeのRdrCEF.exe と AcroRd32.exeというプロセスがCPUを使いすぎているんですが...
- ポインタ型の変数にscanfで値を代入する方法 ポインタ型の変数に,scanfを使って...
- このC言語のプログラムを実行すると コアダンプとでるのですがどこがいけないの...
- Firefox タブの位置を固定するアドオンは? Firefoxのアドオンを探しています。 ...
このカテゴリの回答受付中の質問
- PCから音が出なくなりました。 ホントにバカなことしたなと… High Definition Au...
- windows10 のメール・カレンダーについて 先週までは普通に使えてましたが、今週...
- 台湾モンストの更新があるのですが更新する方法がわかりません。どなたか教えて下...
- ACCESS/フォーム・プロパティの設定方法、もしくはデザイン画面での設定に詳しい...
- 教えてください、例えばYahooのWindowsの画面が大きく普通に出て、左上にも小さく...
- パスワード管理のため、ロボフォームを利用していますが、突然アイコンが表示され...
- スマートビジョン録画中のときにPCを終わらすにはどうすれば良いですか? 休止状...
- PCのピクチャーをDVD-Rに焼きたいのですが出来ません。 windows10を使用しており...
- aviutlについて質問です。 音声フェードが使用できず困っています。大きな音のま...
- パソコン上(デスクトップ上)の動きを撮る方法、フリーソフトがありましたら教え...
このカテゴリの投票受付中の質問
- スマホ版ネットラジオレコーダに録音したの ですが再生しようとすると再生装置が...
- Bluetooth送信が失敗してしまいます。 Nexus5→Windows10で写真を送信 ネットで対...
- 再度【パソコン詳しい方教えてください。】 私のパソコン メーカー デル Win...
- 再度【パソコン詳しい方教えてください。】 私のパソコン メーカー デル Win...
- Win10です。 アプリを更新しようとすると、「エラー 更新のダウンロードに...
- Windows 10を利用しています。 突然以下のようなメッセージが出力されるようにな...
- ■PCのフォルダに関して何ですが__>< 〇エクスプローラーのフォルダを開く...
- 2in1 PCの画面の向きが変わらなくなってしまいました。アクションセンターの回転...
- ubuntuをネットにつなぐことができましたが、ものすごく遅いです。 なかなか自宅...
- ノートンを購入したわけではないのでIDもパスワードも持っていません。でも、パソ...
この質問につけられたタグ
専門家が解決した質問
-
再びのリクエストご容赦下さい DELL Inspiron 15 3000 Series Windows10ノートですが DVDドライブにディスクを挿入した所 Windowsメディアプレイヤーになり ...
回答リクエストをいただきありがとうございます。 Windows10には標準でDVDプレーヤが搭載されていません。 メーカー製PC購入後、すぐにD...
- 古賀竜一
- コンピューターサポートエンジニア
-
再びのリクエストご容赦下さい Googleの同期はフォト、Yahooを含め マイクロソフトアカウントの変更を求められましたが 完了したのですがdocomoへのメール送...
>某出会い系のつぶやきにドライブが2つありますが >支障はございますでしょうか? この部分が具体的にどのような状況なのか不明です の...
- 古賀竜一
- コンピューターサポートエンジニア
片思い、、、脈あり?
回答受付中の質問
カテゴリQ&Aランキング
- 戻る
- 次へ
総合Q&Aランキング
11/22はいい夫婦の日
みんなのアンテナ
Yahoo!知恵袋カテゴリ
お客様自身の責任と判断で、ご利用ください。