デバッガーとは何ですか?問題の診断にどのように役立ちますか?

104
Raedwald 2014-08-20 03:49.

これは、プログラムに問題があるが、デバッガーを使用して問題の原因を診断する方法がわからない新しいプログラマーを支援するための汎用的な質問を目的としています。

この質問は、より具体的な質問の3つのクラスをカバーしています。

2 answers

68
Raedwald 2014-08-20 03:49.

デバッガーは、プログラムの実行中にプログラムの状態を調べることができるプログラムです。デバッガーはどのように機能しますか?デバッガを使用する方法の基本を理解するために重要ではありません。デバッガーを使用して、プログラムがコード内の特定の場所に到達したときにプログラムの実行を停止し、プログラム内の変数の値を調べることができます。デバッガーを使用して、変数の値を調べながら、一度に1行のコード(シングルステッピングと呼ばれる)でプログラムを非常にゆっくりと実行できます。

デバッガーの使用は、期待される基本的なスキルです

デバッガーは、プログラムの問題を診断するのに役立つ非常に強力なツールです。また、デバッガーはすべての実用的なプログラミング言語で利用できます。したがって、デバッガーを使用できることは、プロまたは熱狂的なプログラマーの基本的なスキルと見なされます。また、デバッガーを自分で使用することは、他の人に助けを求める前に自分で行う必要がある基本的な作業 と見なされます。このサイトは専門家や熱狂的なプログラマー向けであり、ヘルプデスクやメンタリングサイトではないため、特定のプログラムの問題について質問があるが、デバッガーを使用したことがない場合、質問は閉じられ、反対票を投じられる可能性が非常に高くなります。そのような質問を続けると、最終的にはそれ以上の投稿がブロックされます。

デバッガーがどのように役立つか

デバッガーを使用すると、変数の値が間違っているかどうか、およびプログラムのどこでその値が間違った値に変更されたかを検出できます。

シングルステッピングを使用すると、制御フローが期待どおりであるかどうかを確認することもできます。たとえば、ifブランチが実行されるはずのときに実行されるかどうかなどです。

デバッガーの使用に関する一般的な注意事項

デバッガーの使用の詳細は、デバッガーと、程度は低いですが、使用しているプログラミング言語によって異なります。

  • プログラムをすでに実行しているプロセスにデバッガーをアタッチできます。プログラムが動かなくなった場合は、そうするかもしれません。

  • 実際には、最初からデバッガーの制御下でプログラムを実行する方が簡単な場合がよくあります。

  • プログラムの実行を停止する場所を指定するには実行を停止する行のソースコードファイルと行番号を指定する、プログラムを停止するメソッド/関数の名前を指定します(として停止する場合)。実行がメソッドに入るとすぐに)。デバッガーがプログラムを停止させるために使用する技術的手段はブレークポイントと呼ばれ、このプロセスはブレークポイントの設定と呼ばれます

  • 最新のデバッガーのほとんどはIDEの一部であり、プログラムのソースコードと変数を調べるための便利なGUIと、ブレークポイントの設定、プログラムの実行、およびシングルステップ操作のためのポイントアンドクリックインターフェイスを提供します。

  • プログラムの実行可能ファイルまたはバイトコードファイルにデバッグシンボル情報とソースコードへの相互参照が含まれていない限り、デバッガーの使用は非常に難しい場合があります。あなたはする必要があるかもしれません若干異なるプログラムをコンパイル(または再コンパイル)の情報が存在することを確認するために。コンパイラーが広範な最適化を実行する場合、それらの相互参照は混乱を招く可能性があります。したがって、最適化をオフにしてプログラム再コンパイルする必要がある場合があります

39
SlugFiller 2015-04-06 02:15.

デバッガーが常に完璧なソリューションであるとは限らず、デバッグの頼りになるソリューションであるとは限らないことを付け加えたいと思います。デバッガーが機能しない場合がいくつかあります。

  • プログラムの失敗する部分は非常に大きく(おそらくモジュール化が不十分ですか?)、コードのステップ実行をどこから開始すればよいか正確にはわかりません。すべてをステップスルーするのは時間がかかりすぎるかもしれません。
  • プログラムは多くのコールバックやその他の非線形フロー制御メソッドを使用しているため、ステップを実行するときにデバッガーが混乱します。
  • プログラムはマルチスレッドです。さらに悪いことに、問題は競合状態が原因です。
  • バグが含まれているコードは、バグが発生する前に何度も実行されます。これは、メインループで特に問題になる可能性があり、さらに悪いことに、問題が数値である可能性がある物理エンジンでは問題になる可能性があります。この場合、ブレークポイントを設定しても、バグが表示されずに何度もブレークポイントをヒットするだけです。
  • プログラムはリアルタイムで実行する必要があります。これは、ネットワークに接続するプログラムにとって大きな問題です。ネットワークコードにブレークポイントを設定した場合、もう一方の端はステップスルーを待つことはなく、単にタイムアウトになります。システムクロックに依存するプログラム、たとえばフレームスキップを使用するゲームも、それほど良いものではありません。
  • プログラムは、ファイルへの書き込みや電子メールの送信など、何らかの形の破壊的なアクションを実行しますが、実行する必要のある回数を制限したいと考えています。
  • バグの原因は関数Xに到達する誤った値であることがわかりますが、これらの値がどこから来ているのかはわかりません。プログラムを何度も何度も実行しなければならないこと、ブレークポイントをどんどん後ろに設定することは、非常に面倒なことです。特に関数Xがプログラム全体の多くの場所から呼び出された場合。

これらすべての場合において、プログラムを突然停止させると、最終結果が異なる可能性があります。または、バグが発生した1行を手動で検索するのは、非常に面倒です。これは、バグが正しくない動作であるか、クラッシュであるかにかかわらず、同様に発生する可能性があります。たとえば、メモリ破損によってクラッシュが発生した場合、クラッシュが発生するまでに、メモリ破損が最初に発生した場所から離れすぎており、有用な情報が残っていません。

それで、選択肢は何ですか?

最も単純なのは、単にロギングとアサーションです。さまざまな時点でプログラムにログを追加し、得られるものと期待するものを比較します。たとえば、バグがあると思われる関数が最初から呼び出されているかどうかを確認します。メソッドの開始時の変数があなたが思っているものであるかどうかを確認してください。ブレークポイントとは異なり、特別なことは何も起こらないログ行がたくさんあっても問題ありません。後でログを検索するだけです。予想とは異なるログ行に到達したら、同じ領域にさらに追加します。バグのある領域のすべての行をログに記録できるほど小さくなるまで、さらに絞り込みます。

アサーションは、エンドユーザーに影響が見られるようになるとではなく、発生したときに誤った値をトラップするために使用できます。間違った値をすばやくキャッチするほど、それを生成したラインに近づきます。

リファクタリングと単体テスト。プログラムが大きすぎる場合は、一度に1つのクラスまたは1つの関数をテストする価値があるかもしれません。入力を与え、出力を見て、どれが期待どおりでないかを確認します。プログラム全体から単一の関数にバグを絞り込むことができると、デバッグ時間に大きな違いが生じる可能性があります。

メモリリークやメモリ踏み込みが発生した場合は、実行時にこれらを分析および検出できる適切なツールを使用してください。実際の破損が発生した場所を検出できるようにすることが最初のステップです。この後、ログを使用して、誤った値が導入された場所に戻ることができます。

デバッグは逆行するプロセスであることを忘れないでください。最終結果(バグ)があり、それに先行する原因を見つけます。それはあなたのやり方を後退させることであり、残念ながら、デバッガーは前進するだけです。これは、優れたロギングと事後分析がはるかに優れた結果をもたらすことができる場所です。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

ジョエル・マクヘイル、マイク・コルター(スクリーンショット:Netflix)「私の神よ、これは1つのことを変えます。」これは、ジョエル・マクヘイルとのジョエル・マクヘイルショーの最後のジョークです。リアリティ番組の嘲笑と寛大なスナキネスの時間は、なじみのある顔を見つけます。

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

画像経由:@pancakeparadox(Twitter)。1997年にポケモンシリーズが初公開されて以来、チームロケット(またはラテンアメリカではチームロケット)として知られる悪役のグループは、何度もアッシュに直面してきました。

今週の科学技術でトランプがめちゃくちゃになったことすべて

今週の科学技術でトランプがめちゃくちゃになったことすべて

画像:ゲッティ私たち全員が千年もの間生きていて、私たちの体が燃える風によってほこりと長引く悲鳴だけに押し流されたと考えるのは驚くべきことです。私たちがそうしていないことを除いて、それはトランプ政権の最初の週の終わりであり、驚くほど多くの恐ろしいことがすでに起こっています。

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

そして今、あることを手に入れていると思っていたが、まったく別のことをしてしまった男の話。CBSニュースは、彼女が「ミニブタ」であるという誤ったふりをしてエスターを養子にしたカナダ人のスティーブジェンキンスの心温まる物語をもたらします。これは、特にせいぜいゴールデンレトリバーまたはセントバーナードをストラップします。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language