• ベストアンサー

C言語でのエラーの直し方について?

C言語でのエラーが発生したとします。その時、どのようにして、エラーを見つけ直していくのですか? 私はprintfを用いて値を見ることでエラーを見つけています。 ステップインで実行して変数にどのような値が入っているか見つけようともしているのですが、変数にa値が16進数で格納されていたり、アドレスがあったりと見方が複雑でうまく発見できていません。 正しい、エラーの見つけ方、直し方とはどういったやり方なのでしょうか?

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

  • ベストアンサー
noname#131551
noname#131551
回答No.1

アナタのデバッグの範囲がよくわかりませんが ●関数の単体検証なら、引数の入出力で解りますよね。 例えば、2つの入力引数を与えると、1つの関数値を返すとか。即ち、ians = func_apb ( ia , ib ); とかで、引数に最大値とか最小値を設定し、戻り値を確認すれば機能どおりでの動作かバグかわかりますよね。ここで、最小値、最小値+1、最小値+2、-1、0、+1、最大値-2、最大値-1、最大値の変化点を検証します。これは、値の極性が正常であることの確認です。 できれば、単体検証では、最大~最小までの値のテストケースを自動投入し、結果の挙動まで検証することが望ましいですね。理由は、上限挙動、下限挙動、極性変化が確実に証明できるからです。Cの良いところは、符号計算を適当にごまかすことです。・・・となると最大値になった瞬間にマイナスにトランジェントするから、バグがわかるわけですよ。 ●関数の結合検証では、関数自体の最大~最小までは検証済みなので、複数のサンプリング値を投入するか、本番データで動作させます。 ●総合検証では、テストケースの準備が複雑なので本番データだけでよいでしょう。 ・・・で、1行ごとのデバッグならエミュレータで変数のダンプを見れば済みますよね。そこのエミュレータ部分はprintf()で抽出しているなら、マクロで記述しておいて、本番コンパイルのとき空行にリプレースすれば、printf()を書いたり消したりせずに、済みます。即ち、テストのソースコードと本番のソースコードは同一で、コンパイル条件が違うだけです。 (組込み系では、printf()などの標準関数は使用しないので、ひたすら変数のダンプです。)

yakyuuoh
質問者

お礼

ありがとうございます。

その他の回答 (3)

回答No.4

> ステップインで実行して変数にどのような値が入っているか見つけようともしているのですが、変数にa値が16進数で格納されていたり、アドレスがあったりと見方が複雑でうまく発見できていません。 デバッガ使ってステップインで確認できるのですよね。 それなら、わざわざprintfで固定の値確認する必要なさそうに感じました。 コンパイラが最適化でデバックで確認しずらいコードに変えている場合があるので、最適化レベルをデバックに支障のない程度に落としてコンパイルしてデバッグすると良い気がします。 デバッガ内で値の確認はアドレスでも値でも10進でも16進でも自由に確認できると思いますので、確認できない場合にはデバッガの使い方をお調べになればよろしいかと。 監視したい変数をウォッチリストに入れておけばその値は常に表示されたり変更時に表示されたりなどデバッガに依っては色々な便利機能がありますので使うと楽になりますよ。 自分で作ったプログラムなのかなあ。他人が作ったプログラムなのかな。他人が作ったプログラムを効率良くデバッグって難しい気もしますが、読解力を付ける(高める)と良さそうですね。 色々なソースを読み色々なやり方を知っておきましょう。

yakyuuoh
質問者

お礼

ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

とりあえず 「変数にa値が16進数で格納されていたり、アドレスがあったり」 の意味が分からん. 「a値」って何? 究極的には「ダンプを見て『こけた原因』を探る」しかないような気がする. 「printfデバッグ」は手軽なんだけど, それでも原因が分からないことはあるので.

yakyuuoh
質問者

お礼

ありがとうございます。

回答No.2

・関数に渡された時の引数の値(入力値) ・関数から返却するときの引数の値(出力値) ・関数内で分岐する直前の値 を調べれば良いです。 アドレス値が分かっても意味がないので、アドレス値が参照している実の値をprintfに出力させてください。

yakyuuoh
質問者

お礼

ありがとうございます。

関連するQ&A