質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • C

    3657questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3430questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • デバッグ

    98questions

    デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

デバッグの方法 コードの読み方

解決済

回答 8

投稿

  • 評価
  • クリップ 2
  • VIEW 955

私は社会人2年目のプログラマーです。組込みシステムの開発をしています。
業務でバグの修正(そのシステムは私の着任する前から開発されていました)を行うことがあるのですが、
よく、”処理を予測してコードを読む”ということをしてしまいます。

例えば先輩に、バグの原因を調査した結果を説明する時は、
「~はこうなっているはず」、「~というプリント文があるからそんな処理がされていると思う」
などという、曖昧な説明になってしまいます。

もっと明確な根拠を得ようとして、処理を追っていこうとはするのですが、
上手くコードを読めません。

そこで、以下のことが知りたいです。

・デバッグするときのコツはあるか
・コードを読む力を向上させるにはどうすればいいか

回答よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 8

+5

調査結果の報告としては確かに不十分ですが、調査の取っ掛かりとしては至極真っ当な手順だと思いますよ。
あとは仮定を立ててそれを立証する作業の繰り返しですね。
コードを弄ることが可能なのであれば自分でprint文を埋めたり空いているGPIOをHi/Loさせてオシロで確認することでそこを通っているか確認するとか、
その時の変数の値をprintしてみるとか、それらの出力順を確認することで関数の呼び出し順を確認するとか。
逆に既存のコードをコメントアウトして何かが起こらなくなることを確認する等々、慣れないうちは片っ端から試すしか無いのではないでしょうか。
ここは筋トレと同じで数・量をこなすしか無いかと。
そのうちプログラム筋みたいなのが鍛えられて効率が上がってきて、ピンポイントで狙いを付けられるケースが増えてきます。
で、今度は慣れからくる思い込みで痛い目に遭って、、、というこれまた繰り返しです。

ですので質問2点に対する回答としては
「とにかく時間・労力を惜しまず地道に繰り返す」
という根性論になってしまいますね。
その際、ただがむしゃらにやるのではなく、「以前の失敗を繰り返さないように」とか「より効率良くするにはどうすれば良いか」といった意識が必須なのは言わずもがなですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

デバッグするときのコツはあるか

デバッグに5分以上の時間がかかる場合は系統的デバッグ手法が有効です。
系統的デバック手法…デバックした仮定を記録する。ことです。
◇参考情報
Software Debuggingまとめ

組込みシステムのデバッカーには詳しくないので、一般論になりますが。
デバッカーのマニュアルを良く読んで機能を確認してみるとか。
例えば、Visual Studioなら高度なブレークポイントとして、ブレイクポイント条件や、ヒットカウントが定義できます。

あと言語がPythonですが、Udacityの無料コースのSoftware Debugging Class Onlineはデバックの考え方について纏まっているので良かったですー。ご参考まで

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/30 21:03

    Software Debugging Class Online
    こんなのあるんですね。ありがとうございます。
    Pythonですか・・・。

    キャンセル

checkベストアンサー

+2

自分の経験ですが、処理の流れを意識してコードを読むよりもデータの流れを意識して読んだ方が結果的にプログラムの内容を把握しやすいと思います。

あと、デバックのコツはバグが見つかった時に、今のプログラムがどのような状態になればそのバグが再現できそうかという視点で解析を行うことですね。
その時に、たくさんの仮説が生まれると思いますが、起きる確率が高そうなものからつぶしていくといった感じですかね。
そこらへんは経験を積まないと身につかないかもしれませんが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

経験を積んでログラムを読む能力を上げることは必須です。制約はありますが、デバッガ gcc+gdbによるプログラムのデバッグ 第1回 ステップ実行、変数の操作、ブレークポイント を使う事も効率的な作業へのひとつです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

こんにちは。

もっと明確な根拠を得ようとして、処理を追っていこうとはするのですが、
上手くコードを読めません。

仕様は把握できていますでしょうか? 仕様が把握できていれば、「何を目的とした処理なのか」が既知なので、そこから掘り起こすことでコードの意味を把握できる筈です。
逆に仕様を把握できていないと、何を目的としたコードなのかをコードそのものから読み取ることになりますが、現実問題無理と私は思います。

・デバッグするときのコツはあるか

あるかないかといえば、あります。私自身はバグを見つける場合、2分探索的な手法を使います。コード全体をいくつかの部分に分けて、どの部分にバグがあるのか判別するために有用なコードを仕込むことを繰り返して、バグに辿り着きます。

極簡単な例では、どこかで落ちているコードがあるなら、実行されるコードの要所要所にprint文を仕込み、その状態で落ちれば表示されたものと表示されなかったものの間にあることが分かるので、更にその間を細分化して探すみたいな方法です。
落ちている場所を見つける時以外にも有用な考え方ですし、手法もprint文とは限りません。ケースバイケースなので具体例を示すのは難しいですが。

・コードを読む力を向上させるにはどうすればいいか

たくさんのコードを読むことが一番と思います。

また、C++の場合C++の言語仕様を把握することも重要です。対象のコードに使われているC++の機能を把握しないことには読むことができません。しかし、C++の機能は本当に多量にあるので、正直なところ全部を把握するのは厳しいと感じます。
ですので、眼の前のコードについて理解しようと努力しても理解できない部分については、そのコードを書いた人に聞くのがベストと思います。コード書いた人が既にいないなら、ある程度C++に詳しい人に聞くのも手ですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

デバッグ時にできることはたかが知れています。コーディング時に読みやすく作ることや高機能デバッガを使うことが有力な手段です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

デバッグに限らず、解析などでも、入出力のスコープを段々狭めていく方法を取ります。
データの入出力があるなら、先ずその入出力の内容を理解します。

最初はコードが読めなかったとしても、入出力のスコープを狭めれば、コードと行っている事の対比が明確になり、理解もし易いと思っています。

また、バグに関しては幾つかの発生原因を想定して調査しますが、どこまで掘り下げていくかについては、やはり外側のスコープから確認し、そのスコープ内で起こり得ない場合には、掘り下げずにスキップするようにすると無駄な時間が省けるのかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

こんばんは。
参考になるかわかりませんが、私が行なっていることを紹介します。

デバッグするときのコツはあるか

デバッグモードで実行できることが前提になりますが、
プログラムの先頭からステップ実行で処理を追いかけると、バグを作り込んでいる場所によって、時間がかかる場合がありますので、ブレークポイントをどこに置くかを最初に考えてます。

バグの現象が目に見えている場合(エラーメッセージが出ている、例外が発行されている、想定外のページが表示されている など)は、どこの処理でメッセージ表示や画面表示がされているかを探します。
複数箇所ある場合は、その処理が実行される条件を確認して、明らかに関係ないと判断できる場所は除外して、判断できない場所にブレークポイントを置いて、デバック実行してます。

判定条件で変数値を確認して、想定外の値が入っている場合は、その値がセットされた経緯を追いかけていくと、呼び出し元の条件や編集にミスが見つかることが多いです。

コードを読む力を向上させるにはどうすればいいか

私は色々な人のソースを読んでます。
見やすいコードを書く人、見にくいコードを書く人など様々な人がいるので、どういった考え方で処理を組み立てているのか読み解いているうちに、ソースを読むのが早くなりました。

よく考えてるな〜と、関心させられるコードも沢山あり、自分が開発するソースにも役立ってます。
私見ですが、「自分だったら、こう書くな〜」など考えながら人のコードを読むと、より理解が深まり読む力がつくのではないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3657questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3430questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • デバッグ

    98questions

    デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。