• ベストアンサー

malloc呼び出し時のセグメンテーションフォルト

UNIX(HP-UX)上でCプログラムを組んでおります。 その際、mallocでセグメンテーションフォルトが起こりました。 mallocでセグメンテーションフォルトが起こった場合、どのように調査するのか、また実際どのような原因で起こりうるのか教えていただけますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BILLY-J
  • ベストアンサー率57% (60/105)
回答No.1

そのようなケースでは、既にその malloc 以前のコードでメモリが 破壊されている事が多いです。 例えば、こんなミスが有るとメモリやスタック等が壊れる可能性大。 ・不正なアドレスを解放している、または多重解放している ・バッファ(配列)のオーバーまたはアンダー ・printf や scanf で型指定と引数型が合っていない  例)printf("%s", int値); ・printf や scanf 等の可変引数呼出で引数の数が合っていない  例)printf("%d %d", int値); また、malloc で要求したメモリ量が確保出来なかった場合に、メモリ 不足のエラーではなくセグメンテーションフォルトやアクセス違反等の エラーが発生した事も有りました。

Nao7987
質問者

お礼

回答ありがとうございました。 指摘された点を地道に追ってみます。 回答に対する質問なんですが。。。 バッファのアンダーとはどの様な時に発生するのですか?

その他の回答 (2)

  • BILLY-J
  • ベストアンサー率57% (60/105)
回答No.3

#1です。 >バッファのアンダーとはどの様な時に発生するのですか? 例えば配列をインデックス値ではなくポインタの加減算で参照 している時、更には後方検索などで最後尾から先頭に向かって ループさせるようなロジックで起こり得ます。 インデックス値がゼロを通り越してマイナスになってしまう ようなイメージです。

Nao7987
質問者

お礼

質問への回答ありがとうございます。 なるほど、配列の先頭より前を見てしまうような場合ですね。 アンダーという言葉からイメージが湧かなくて。。。お手数おかけしました。 まだまだ、解決の糸口が見つからないのですが頑張りますね。

  • angband
  • ベストアンサー率51% (86/168)
回答No.2

malloc自体が問題の場合はdmallocというライブラリが あります。これはmallocをリプレースして、各種検査が 可能になります。HP-UXでも使えます。 http://dmalloc.com/ mallocする前に壊れている場合は、デバッグはマジで 大変なものの1つだと思います(規模にもよりますが)。 ポインタ周りであれば、僕はCのプログラムでもとりあえず モジュールごとにclassで囲んでC++コンパイラでリンク してみます。クラスにしてみるとどのコードがだめなのか 判定できますし、コードを1行づつ追うのは精神衛生上 よくないでしょうしね・・

参考URL:
http://dmalloc.com/
Nao7987
質問者

お礼

回答ありがとうございます。 頑張ってdmallocを利用してみます。 angbandさんはC++コンパイラでリンクしてみるとのことですが、C++に手をつけたことのない身としてはそちらの手段は目下の所無理そうです。 教えていただいたことは、もう少し余裕のあるときに試してみますね。

関連するQ&A

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

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

  • セグメンテーションフォルトが起きます。

    gccでセグメンテーションフォルトが起きます。 gdbでデバッグしたのですがどうもSTLのコードでセグメンテーションフォルトがおきているようなのです。 そんなことってあるのでしょうか。 何かわかる方アドバイスお願いします。 以下はgdbで実行した結果です。 Program received signal SIGSEGV, Segmentation fault. CNFLiteral::CNFLiteral (this=0x16eec0, cnf=@0x16ef80) at /usr/include/c++/3.3.3/bits/stl_iterator.h:642 642 base() const { return _M_current; }

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

    char *name この宣言でプログラムの組初めはこれでいけたのですが char *name = (char *)malloc(sizeof(char) * 10); 後からこのようにmallocで動的メモリ確保しないとセグメンテーション違反が起きるようになりました。 なぜこうなるのでしょうか? それとmallocの使うタイミング(どういう時)に使えばよいのでしょうか?

  • HP-UXへの移植でセグメンテーション障害が発生し、困っています

    HP-UXへの移植で困っています。 strcpy(Month->Data,Data.arr); というコードがあり、今まではDigital Unix上では正常に動作していました。しかしHP-UX上でコンパイル、実行するとセグメンテーション障害が発生し、正常に動作しません。 どなたか助けてください。

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

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

  • mallocについて

    mallocについて 現在C言語でプログラムをかいているのですが、原因不明のエラーが出て困っています。 それはmallocによる動的メモリ確保を行ったとき、 (float *)malloc(sizeof(float)*200)の場合大丈夫ですが、 (float *)malloc(sizeof(float)*320)ではエラーが出てしまうのです。 しかし (float **)malloc(sizeof(float*)*640)とした場合エラーは出ませんでした。 これは何が原因でエラーが出ているのでしょうか? ちなみにコンパイルはできており、実行したとき プログラム名(7637) malloc: *** error for object 0x100ff7a08: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug というエラーがでます。

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

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

  • malloc.cを見たい

    TurboLinux10でとあるプログラムを実行していましたが、 coreファイルを吐き出してGUIが終了してしまうことがあります。  gdb -c core.**** 実行ファイル名 というコマンドでGUIが終了した原因を調べたところ、  kernel/malloc.c:3415  kernel/malloc.c そのようなファイルやディレクトリは見つかりません。 と出ていました。 malloc.cというソースファイルを見たいのですが、 どこから入手すればよいでしょうか。 TurboLinux10は「全パッケージ」を選択してインストールしており、 カーネル再構築もできるのでカーネルのソースファイルは入っているはずですが、 最低3415行もあるmalloc.cは存在しません(十数行の同名ファイルはありました)。 TurboLinux10DesktopのソースファイルをFTPサーバーからダウンロードしようと、 ftp://ftp.turbolinux.co.jp/pub/TurboLinux/TurboLinux/ia32/Desktop/10/source/SRPMS/ に行ってみたのですが、 勿論malloc.cが入っていそうなパッケージがわかりません。 (そもそも、「malloc.cが見つからない」と出た場合にmalloc.cを入手してくるべきなのでしょうか)

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

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

  • なぜセグメンテーション違反??

    こんにちは。ちょっとお聞きしたいのですが、、、 友達が作ったプログラムを私のディレクトリにコピーして実行しようとしたら「セグメンテーション違反です」と表示されます。 友達のログインしたPCではうまく作動するのですが・・・。 こんなことってあるのでしょうか? 違うディレクトリにコピーしたことが原因なのでしょうかねぇ?? わかる方おられましたら、教えていただきたいです!!

専門家に質問してみよう