• 締切済み

セグメンテーションエラー

初めまして。 余り詳しくないのですが、Cでバイナリファイルを読み込み、10分ごとにDBに書き込む永久ループのプログラムを作っています。 コンパイルも出来て、動くのですが、3回ぐらい書き込むと セグメンテーションエラーで止まります。時には、6-7回書き込めたりします。 DBに書き込むところを省いても、エラーが出てしまうのですが、どのような部分を調べていったらいいですか?

みんなの回答

回答No.6

用意したメモリ領域を超えて読み書きすると かなりの頻度で起こります > セグメンテーション・エラー バッファ小さすぎ/読み込み多すぎ とかありません?

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.5

gccならデバッガはgdbですね http://www.h7.dion.ne.jp/~matsu/feature/gdb/ 適当に検索してみました。 私も学生の頃はgcc使ってたけど、gdbは殆ど……(苦笑

gugukoro
質問者

補足

gdb やってみました。 ・・・gdbが動きませんでした。ふぅ。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.4

がるです。 「デバッグプリント というのは、 プリント文をいろんなところに入れてどこで落ちるか調べる という事で良い」です。 #2さんがおっしゃるように、デバッガと呼ばれるものを使っての調査方法も無論あるのですが(慣れれば便利ですし)。 ただ、printf文とかを使って「場所を特定したり状況を把握したりする」のは、特殊な状態を除く大抵の場合に用いることが出来る、比較的に汎用性の高いデバッグ方法なので、一度覚えておくと随所で楽が出来ます ^^ バグはまず「そのバグと遊んで戯れて」みるのが一番です。 あんまり毛嫌いせず、しばらく一緒に遊んであげるくらいの余裕を持って接してあげてください。

gugukoro
質問者

お礼

ありがとうございます。。戯れる 余裕があれば良いのですが・・。人の作ったプログラムを改造して使っているので、無知識なまま作業をしてるので余裕が持てません。。 一つ一つやってみています。 ちなみに、 セグメンテーション違反 でした。。

回答No.3

質問するならまず、自分の環境を書きましょう。 それはさておき、最初の何回か動いて落ちるという症状は何らかの資源の解放忘れの可能性が高そうです。 確保したメモリは解放してますか? 開いたファイルはクローズしていますか? そもそもエラーチェックはしていますか?

gugukoro
質問者

補足

環境 gcc/i386-redhat-linux/3.4.6  メモリの解放 すみません、意味から調べてみます。 開いたファイルはクローズしてます。 エラーチェック も、意味から調べます。

noname#20242
noname#20242
回答No.2

使っているコンパイラにもよりますが、デバッガ上で動かしたらエラー発生時に原因が解析しやすいと思います。 デバッガ上ではバックトーレスなど解析しやすいと思いますので。

gugukoro
質問者

お礼

デバッガ上で動かす・・・ よく分かりませんが、頑張って調べてみます。

gugukoro
質問者

補足

デバッガ を調べてみましたが、何がなんだかよく分かりません。週明けまでに解決したいので、何か、参考書・参考URLがあったら教えてもらえますか? コンパイラはgcc/i386-redhat-linux/3.4.6 です。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 基本的には「メモリ周り」になるのですが。とりあえず、デバッグプリントなどを行って「どこで落ちたか」「どんな状態で落ちたか」をきちんと把握するのが、デバッグ全般の基本になるかと思います。

gugukoro
質問者

お礼

ありがとうございます。一度記録し、スリープを30秒ぐらい設定してあります。 再度ファイルを見に行き、ある部分が変わっていたら数値を読み込む感じなのですが、ある部分の変化を捉えて、再読み込みのところまで行くのですが、そこでストップするようです。 デバッグ の技術が未熟ですので、その辺調べてやってみようと思います。 ちなみに、 デバッグプリント というのは、 プリント文をいろんなところに入れてどこで落ちるか調べる という事で良いのでしょうか?用語もわからずもうしわけありません。

関連するQ&A

  • セグメンテーション違反とは??

    linuxでC言語のプログラムを構築しています。 gccでコンパイルしたときにセグメンテーション違反という エラーが出てしまいます。 セグメンテーション違反とは一体なんの ことなんでしょうか? メモリのことだと思ってるんですが、原因がよくわかりません。C言語初心者なので わかりやすく教えて頂けるとありがたいです。

  • セグメンテーション違反について

    C言語であるプログラムを作っています。コンパイルは上手くできるのですが、実行するとセグメンテーション違反と出てしまいます。それもセグメンテーション違反と出るときと出ないときがあり困っています。そこでプログラム中のどこがセグメンテーション違反を指しているのか知りたいのですが、何かセグメンテーション違反の場所を教えてくれるようなオプションはないでしょうか? プログラムソースを見てもらうのが一番いいと思いますが、行数が1000行を超えているので断念しました。OSはLinuxでコンパイラはgccです。どなたかご教授お願いします。

  • セグメンテーション違反について

    現在、FORTRANを使ってプログラミングを行っています。 プログラムを作って、コンパイルまではうまくいき、いざファイルを実行してみると、「セグメンテーション違反です」という文字が出てしまいました。 いったい何が原因でそのような現象が起こってしまったのでしょうか。 ご教授願えればと思います。

  • セグメンテーションエラー

    C++ on Vine (バージョン共にわからず)です。 セグメンテーションエラーは、メモリの領域破壊の時にでるようですが、 その他の原因はありますか? また、メモリの領域破壊とは、 配列の要素数以上に要素を詰め込もうとしたとき 以外の要因はありますか? ポインタを使えばいろいろ破壊できそうですが、 そういうのはなしで。

  • セグメンテーション違反

    C言語を使用しています。 構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に 「セグメンテーション違反です (core dumped)」 となってしまい、それ以上行えません。 構造体と代入したい変数との型は、合っています。 いろいろ本などで見ましたが、何が原因かわからず困っています。 教えてください。 宜しくお願いします。

  • この数式でセグメンテーションエラーがでてしまいます

    c言語でこの数式を入れるとコンパイルは可能なのですがセグメンテーションエラーが出てしまいます。 どこが間違えているのかご指摘お願いします。 w[j+1] = -1*w[j-1] + ( (2+h*h) * w[j] ) / ( 1+h*h*w[j]*w[j] ) + ( ( h*h*h*h*w[j]*w[j]*w[j] ) * ( 1-2*w[j]*w[j] ) ) /(1+h*h*w[j]*w[j] ) ; このような数式なのですがどこが間違えているのでしょうか?

  • セグメンテーション・フォールト

    UNIXで、CよりOracleのSQL*Loaderを使用しています。 CSVファイル->Oracleのテーブル でデータを挿入する際に、テーブルのカラムサイズが 足りずにエラーが発生し、最大エラー件数を超えたので 処理がエラーで終了しました。 その際に、 セグメンテーション・フォールト(coredump) というメッセージが表示されます。 ついでに補足するならば、Cのプログラムを直接起動すると、 上記エラーメッセージ出力後、プロセスは終了しますが、 別プログラムより起動した場合(UID=root)、 プロセスが終了してくれません。 上記メッセージの意味と、なぜrootからだと プロセスが終了しないのか、が分かりません。 どなたかお分かりになる方、よろしくお願いします。

  • セグメンテーションエラーの原因がわからず困っています

    以下のプログラムで”セグメンテーションエラーです”の文字が表示され上手いこと動きません。 何がダメなのか、ご助言を頂けないでしょうか。どうぞよろしくお願いします。環境はCentosです。 #include<stdlib.h> #include<string.h> main(){ char s[11]; FILE *fp; fp = popen("netstat -s |grep total","r"); if(fp = NULL){ printf("reading error"); exit(-2); } FILE *fp2; fp2 = fopen("file.txt","r"); fscanf(fp,"%9s",s); int a; printf("%s\n",s); a = atol(s); printf("%ld",a); pclose(fp); fclose(fp2); }

  • PHPのセグメンテーション違反に対する例外処理について

    PHPのセグメンテーション違反に対する例外処理について 再帰呼び出しのプログラム(error_seg.php)を作成し、Linuxのシェルで  $ php error_seg.php と実行しました。 実行環境: PHPのバージョン:5.2.10 Linuxのバージョン:2.6.18-164.15.1.el5 (mockbuild@builder16.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Wed Mar 17 11:37:14 EDT 2010 プログラムは下記の通りです。 <?php $cnt=0; function func(){ global $cnt; $cnt++; print $cnt . "回目の呼び出し\n"; func(); } try{ func(); }catch(Exception $e){ echo "例外発生:" . $e->getMessage()."\n"; } ?> ※このプログラムは、   http://d.hatena.ne.jp/syonbori_tech/20090414/1239717538  のサイトを参考にして作りました。 この結果、  1回目の呼び出し  2回目の呼び出し  ・・・  26187回目の呼び出し  26188回目の呼び出し  セグメンテーション違反です と表示され、セグメンテーション違反を再現させました。 ※何回目でセグメンテーション違反が発生するかは、  その都度異なります。 プログラム中で、try-catchの例外処理を入れたのですが、 例外処理されないようです。セグメンテーション違反に対して 例外処理をすることはできないのでしょうか。 できるとすれば、どのように記述をすればよいでしょうか。

    • ベストアンサー
    • PHP
  • fclose()でセグメンテーション違反

    C言語でのファイル読み込みで、ファイルを開いてデータを読み込んで表示することはできたのですが、最後のfclose(fp)でセグメンテーション違反になります。一番最後のwhileループをコメントアウトしたところセグメンテーション違反にはならなかったので、ここに何か問題があると思うのですが、どこが悪いのかが分かりません... #include<stdio.h> #include<stdlib.h> main(void){ FILE *fp; int i=0 , j=0 ,cnt = 0 , c=0; char *name="data.txt"; float *buf1,*buf2; if((fp = fopen(name,"r")) == NULL){ printf("error\n"); return 0; } else{ while((c = getc(fp)) != EOF) { if(c == '\n') cnt++; } printf(">>%d<<\n",cnt+1); rewind(fp); buf1 = (float *)malloc( (int)(cnt/2) +1); buf2 = (float *)malloc( (int)(cnt/2) +1); /*ここからがおかしい?*/ while(1){ if( fscanf( fp ,"%f %f",&buf1[i],&buf2[i])==EOF )break; printf("%f %f\n",buf1[i],buf2[i]); i++; } fclose(fp); } return 0; } なぜセグメンテーション違反になっているのでしょうか?

専門家に質問してみよう