アプリ版:「スタンプのみでお礼する」機能のリリースについて

UNIX(HP-UX)上でCプログラムを組んでおります。
その際、mallocでセグメンテーションフォルトが起こりました。

mallocでセグメンテーションフォルトが起こった場合、どのように調査するのか、また実際どのような原因で起こりうるのか教えていただけますでしょうか?

A 回答 (3件)

そのようなケースでは、既にその malloc 以前のコードでメモリが


破壊されている事が多いです。

例えば、こんなミスが有るとメモリやスタック等が壊れる可能性大。

・不正なアドレスを解放している、または多重解放している
・バッファ(配列)のオーバーまたはアンダー
・printf や scanf で型指定と引数型が合っていない
 例)printf("%s", int値);
・printf や scanf 等の可変引数呼出で引数の数が合っていない
 例)printf("%d %d", int値);

また、malloc で要求したメモリ量が確保出来なかった場合に、メモリ
不足のエラーではなくセグメンテーションフォルトやアクセス違反等の
エラーが発生した事も有りました。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
指摘された点を地道に追ってみます。

回答に対する質問なんですが。。。
バッファのアンダーとはどの様な時に発生するのですか?

お礼日時:2004/01/09 17:45

#1です。



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

インデックス値がゼロを通り越してマイナスになってしまう
ようなイメージです。
    • good
    • 0
この回答へのお礼

質問への回答ありがとうございます。

なるほど、配列の先頭より前を見てしまうような場合ですね。
アンダーという言葉からイメージが湧かなくて。。。お手数おかけしました。

まだまだ、解決の糸口が見つからないのですが頑張りますね。

お礼日時:2004/01/09 21:05

malloc自体が問題の場合はdmallocというライブラリが


あります。これはmallocをリプレースして、各種検査が
可能になります。HP-UXでも使えます。
http://dmalloc.com/

mallocする前に壊れている場合は、デバッグはマジで
大変なものの1つだと思います(規模にもよりますが)。
ポインタ周りであれば、僕はCのプログラムでもとりあえず
モジュールごとにclassで囲んでC++コンパイラでリンク
してみます。クラスにしてみるとどのコードがだめなのか
判定できますし、コードを1行づつ追うのは精神衛生上
よくないでしょうしね・・

参考URL:http://dmalloc.com/
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
頑張ってdmallocを利用してみます。

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

お礼日時:2004/01/09 18:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!