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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

デバッグ

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

C++

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

Q&A

解決済

8回答

4831閲覧

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

sigmacshaling

総合スコア14

C

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

デバッグ

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

C++

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

0グッド

2クリップ

投稿2018/06/30 10:39

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

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答8

0

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

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

投稿2018/06/30 11:13

illusionist

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

投稿2018/06/30 11:26

編集2018/06/30 11:26
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sigmacshaling

2018/06/30 12:03

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

0

ベストアンサー

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

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

投稿2018/06/30 18:24

TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

もっと明確な根拠を得ようとして、処理を追っていこうとはするのですが、

上手くコードを読めません。

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

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

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

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

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

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

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

投稿2018/06/30 11:01

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2018/06/30 10:54

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

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

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

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

投稿2018/07/03 14:56

Shara

総合スコア125

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2018/06/30 12:52

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2018/06/30 10:58

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問