- 締切済み
セグメンテーションエラー
初めまして。 余り詳しくないのですが、Cでバイナリファイルを読み込み、10分ごとにDBに書き込む永久ループのプログラムを作っています。 コンパイルも出来て、動くのですが、3回ぐらい書き込むと セグメンテーションエラーで止まります。時には、6-7回書き込めたりします。 DBに書き込むところを省いても、エラーが出てしまうのですが、どのような部分を調べていったらいいですか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
用意したメモリ領域を超えて読み書きすると かなりの頻度で起こります > セグメンテーション・エラー バッファ小さすぎ/読み込み多すぎ とかありません?
- Trick--o--
- ベストアンサー率20% (413/2034)
gccならデバッガはgdbですね http://www.h7.dion.ne.jp/~matsu/feature/gdb/ 適当に検索してみました。 私も学生の頃はgcc使ってたけど、gdbは殆ど……(苦笑
- galluda
- ベストアンサー率35% (440/1242)
がるです。 「デバッグプリント というのは、 プリント文をいろんなところに入れてどこで落ちるか調べる という事で良い」です。 #2さんがおっしゃるように、デバッガと呼ばれるものを使っての調査方法も無論あるのですが(慣れれば便利ですし)。 ただ、printf文とかを使って「場所を特定したり状況を把握したりする」のは、特殊な状態を除く大抵の場合に用いることが出来る、比較的に汎用性の高いデバッグ方法なので、一度覚えておくと随所で楽が出来ます ^^ バグはまず「そのバグと遊んで戯れて」みるのが一番です。 あんまり毛嫌いせず、しばらく一緒に遊んであげるくらいの余裕を持って接してあげてください。
お礼
ありがとうございます。。戯れる 余裕があれば良いのですが・・。人の作ったプログラムを改造して使っているので、無知識なまま作業をしてるので余裕が持てません。。 一つ一つやってみています。 ちなみに、 セグメンテーション違反 でした。。
- charmer29-2
- ベストアンサー率25% (41/159)
質問するならまず、自分の環境を書きましょう。 それはさておき、最初の何回か動いて落ちるという症状は何らかの資源の解放忘れの可能性が高そうです。 確保したメモリは解放してますか? 開いたファイルはクローズしていますか? そもそもエラーチェックはしていますか?
補足
環境 gcc/i386-redhat-linux/3.4.6 メモリの解放 すみません、意味から調べてみます。 開いたファイルはクローズしてます。 エラーチェック も、意味から調べます。
使っているコンパイラにもよりますが、デバッガ上で動かしたらエラー発生時に原因が解析しやすいと思います。 デバッガ上ではバックトーレスなど解析しやすいと思いますので。
お礼
デバッガ上で動かす・・・ よく分かりませんが、頑張って調べてみます。
補足
デバッガ を調べてみましたが、何がなんだかよく分かりません。週明けまでに解決したいので、何か、参考書・参考URLがあったら教えてもらえますか? コンパイラはgcc/i386-redhat-linux/3.4.6 です。
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 基本的には「メモリ周り」になるのですが。とりあえず、デバッグプリントなどを行って「どこで落ちたか」「どんな状態で落ちたか」をきちんと把握するのが、デバッグ全般の基本になるかと思います。
お礼
ありがとうございます。一度記録し、スリープを30秒ぐらい設定してあります。 再度ファイルを見に行き、ある部分が変わっていたら数値を読み込む感じなのですが、ある部分の変化を捉えて、再読み込みのところまで行くのですが、そこでストップするようです。 デバッグ の技術が未熟ですので、その辺調べてやってみようと思います。 ちなみに、 デバッグプリント というのは、 プリント文をいろんなところに入れてどこで落ちるか調べる という事で良いのでしょうか?用語もわからずもうしわけありません。
補足
gdb やってみました。 ・・・gdbが動きませんでした。ふぅ。