IDEでのデバッグが優れているのはなぜですか?[閉まっている]


145

私は20年以上ソフトウェア開発者として、C、Perl、SQL、Java、PHP、JavaScript、そして最近ではPythonでプログラミングしています。私は、いくつかの注意深い思考と適切に配置されたデバッグprintステートメントを使用してデバッグできない問題に遭遇したことがありません。

私のテクニックは原始的であり、IDEで実際のデバッガを使用する方がはるかに優れていると多くの人が言うことを尊重します。それでも私の観察では、IDEユーザーは、私の石ナイフとクマの皮を使用して、私よりも速くまたはよりうまくデバッグしているようには見えません。私は適切なツールを学ぶことに心からオープンですが、ビジュアルデバッガーを使用することの説得力のある利点を示したことはありません。

さらに、ブレークポイントを設定して変数の内容を表示する方法の基本を超えて、IDEを使用して効果的にデバッグする方法を示すチュートリアルや本を読んだことがありません。

何が欠けていますか?IDEデバッグツールは、診断printステートメントを慎重に使用するよりもはるかに効果的です。

IDEデバッグのより優れた手法を示すリソース(チュートリアル、書籍、スクリーンキャスト)を提案できますか?


甘い答え!お時間を割いていただき、ありがとうございました。非常に明るい。私は多くに賛成票を投じ、どれにも反対票を投じなかった。

いくつかの注目すべき点:

  • デバッガーは、変数、コード、またはランタイム環境の他の側面のアドホックインスペクションまたは変更を行うのに役立ちますが、手動デバッグでは、アプリケーションを停止、編集、および再実行する必要があります(おそらく再コンパイルが必要です)。
  • デバッガーは実行中のプロセスにアタッチしたり、クラッシュダンプを使用したりできますが、手動デバッグでは、「再現するための手順」が必要です。
  • デバッガーは、複雑なデータ構造、マルチスレッド環境、または完全なランタイムスタックを簡単かつ読みやすい方法で表示できます。
  • デバッガーは、ほとんどすべてのデバッグタスクを実行する時間と反復作業を削減する多くの方法を提供します。
  • ビジュアルデバッガーとコンソールデバッガーはどちらも便利で、多くの機能が共通しています。
  • IDEに統合されたビジュアルデバッガーを使用すると、単一の統合開発環境(その名前)で、スマート編集やIDEの他のすべての機能に簡単にアクセスできます。

14
デバッガを使用するにはIDEが必要であると誤って想定していると思いますか?デバッガは、IDE内で使用されるかどうかにかかわらず、非常に貴重なツールです。
codelogic 2009年

私は同意します、質問はIDEのデバッガーではデバッグできないとほとんど主張していますが、これは事実ではありません。IDEの有無にかかわらずデバッガーを実行できますが、彼はそれを知っていると確信しています:)彼はビジュアルデバッガーについて具体的に尋ねているのでしょうか?
hhafez 2009年

はい、ビジュアルデバッガです。私はgdbなどの非ビジュアルデバッガーも知っていますが、これらは同じタイプのアドボカシーを得られません。
ビルカーウィン

あなたの質問の主な問題は、IDEをデバッガーと間違えることです。IDEでのデバッグについて尋ねましたが、IDEとデバッガーを同等と見なしており、「非IDE」はデバッガーを使用しないことを意味しているようです。IDE!=デバッガ。IDEは嫌いですが、デバッガーが好きです。あなたの質問に答えるには、IDEとデバッガーの異なる点を説明する必要があります。「地球は丸いのか、それとも自転車を買えばいいのか」と尋ねるようなものです。
stefanB 2010

6
@stefanB:私は私の質問に対して多くの良い答えを受け取りました。これは、あなたが不必要に知識を失っていることを示しています。
ビルカーウィン、

回答:


108

IDEデバッガーがコード内のトレースメッセージに対して提供するいくつかの機能の例:

  • いつでもコールスタックを表示して、現在のスタックフレームのコンテキストを確認できます。
  • トレースを追加する目的で再コンパイルできないライブラリにステップインします(デバッグシンボルにアクセスできる場合)。
  • プログラムの実行中に変数値変更する
  • 編集して続行- コードの実行中にコードを変更し、変更の結果をすぐに確認する機能
  • 変数を監視し、いつ変化するかを確認できる
  • コードのセクションスキップまたは繰り返して、コードのパフォーマンスを確認する。これにより、理論上の変更を行う前にテストすることができます。
  • メモリの内容をリアルタイムで調べる
  • 特定の例外がスローされた場合は、それらがアプリケーションによって処理されている場合でも、アラートを出します。
  • 条件付きブレークポイント。例外的な状況でのみアプリケーションを停止して、スタックと変数を分析できるようにします。
  • マルチスレッドアプリケーションでスレッドコンテキストを表示します。これは、トレースでは実現が難しい場合があります(異なるスレッドからのトレースが出力にインターリーブされるため)。

要約すると、印刷ステートメントは(通常)静的であり、元のステートメントが十分に詳細ではなかった場合は、追加の情報を取得するために再コンパイルする必要があります。IDEはこの静的な障壁を取り除き、あなたの指先で動的なツールキットを提供します。

私が最初にコーディングを始めたとき、私はデバッガーの大事なことを理解できず、トレースで何でも達成できると思っていました(もちろん、それはUNIX上で、デバッガーはGDBでした)。しかし、グラフィカルデバッガーを適切に使用する方法を習得したら、ステートメントの印刷に戻りたくありません。


3
動的デバッグの側面は良い点です。
ビルカーウィン

2
ウォッチよりも便利で、コードをステップ実行しているときに変数名にカーソルを合わせると、値のツールチップが表示されます。ツールチップをクリックして、その値を変更することもできます。そのruxx0rs。
ジョンデイビス

これらの大部分は、IDEの有無にかかわらず、対話型デバッガーのプロパティです。つまり、GDBを使用すると、リストにあるすべてのもの(変更コードが存在する可能性がある例外を除く)が可能になります。
dmckee ---元モデレーターの子猫

1
はい、しかしOPは「IDEデバッグツールが診断用印刷ステートメントの慎重な使用よりもはるかに効果的である理由は何ですか?」と尋ねました。IDEデバッグツールと印刷ステートメントではなく、IDEデバッグとコンソールデバッグを比較していました。
LeopardSkinPillBoxHat 2009年

エディットコンティニューは非常に強力なツールです。もっと多くのコンパイラがそれをサポートすることを本当に望みます。それは悪い習慣を可能にすることができますか?承知しました。ソース管理でさえ、悪い開発慣行を可能にする可能性があります。E&Cを使用すると、プログラマーは問題をより効果的に追跡することができます。
ダロン2009年

34
  • IDEデバッガーを使用すると、実行時に変数の値を変更できます。

  • IDEデバッガーを使用すると、実行の開始時に確認したいと思っていた変数の値を確認できます。

  • IDEデバッガーを使用すると、コールスタックを確認して、奇妙な値を渡された関数の状態を調べることができます。(この関数が何百もの場所から呼び出されていると考えてください、これらの奇妙な値がどこから来ているのかわかりません)

  • IDEデバッガーを使用すると、行番号ではなく条件に基づいて、コードの任意の時点で条件付きで実行を中断できます。

  • IDEデバッガーを使用すると、単に処理するのではなく、未処理の例外が発生した場合にプログラムの状態を調べることができます。


1
@ジョー、ビルの質問の文脈では、それら同等だと思います。Billがprintfのデバッグについて話している。デバッガーがエディターおよびコンパイラーと統合されているかどうかは、その時点では重要ではありません。
ロブ・ケネディ

問題は、IDEデバッガーではないgdbがこれらの機能をすべて備えているということです
Tamas Czinege

問題は、IDEデバッガーと印刷スタイルデバッグのどちらかでした。そのままにしておきます。
再帰的

はい、これらはデバッガの非常に有効な利点です。これらの機能はコンソールデバッガでも利用できることを理解していますが、これらの機能は確かに私の質問に対する適切な回答です。
ビルカーウィン、

16

これは、「print」ステートメントでは絶対にデバッグできないものの1つです。これは、顧客がメモリダンプを持ち込んで「プログラムがクラッシュした、理由を教えてください」と言ったときです。


5
私は興味をそそられます、デバッガーはこれをどのように解決しますか?でもすごい、パンチのあるポイントです:)
TheIronKnuckle 2013年

14
  • コード全体でステートメントを印刷すると、読みやすさが低下します。
  • デバッグ目的でのみそれらを追加および削除するには時間がかかります
  • デバッガーはコールスタックを追跡し、現在の場所を簡単に確認できます
  • 変数はその場で変更できます
  • 実行の一時停止中にアドホックコマンドを実行して、診断を支援できます。
  • 印刷ステートメントと組み合わせて使用​​できます:Debug.Write( "...")

1
そのリストをありがとう。これらすべての点がビジュアルデバッグの魅力的な利点であるとは限りません。たとえば、多くの言語環境でスタックトレースを簡単に出力できます。
ビルカーウィン

1
#2の場合:デバッガをサーバーに接続するのに時間がかかる場合があります:)
inkredibl 2009年

9

printステートメントを使用したデバッグは失われた芸術であり、すべての開発者が学ぶことは非常に重要だと思います。その方法を知ったら、特定の種類のバグは、IDEを使用するよりもその方法でデバッグする方がはるかに簡単になります。この手法を知っているプログラマーは、デバッグ以外の目的でも、ログメッセージ(実際にはログを最後に読み取ることになることは言うまでもありません)に入力するのに役立つ情報をよく理解しています。

そうは言っても、異なるクラスのバグの方がはるかに簡単なので、ステップスルーデバッガーの使用方法を本当に知っている必要があります。その理由を説明するために、すでに投稿されている他の優れた回答に任せます:)


同意し、視点をありがとう。高度なビジュアルデバッガーが役立つからといって、すべてのタスクに最適であるとは限りません。他のツールと同じように、スイートスポットがあります。
ビルカーウィン、

それに同意する、印刷を使用することは重要なスキルです。ファイルを編集して実行するだけの限られたツールセットしか持っていなかったとき、多くの時間を節約してくれました(これは特にWeb開発に当てはまります)。
inkredibl 2009年

2
また、マルチスレッドの競合状態と戦っている場合は、printの使用が必須です。ブレークポイントIDEデバッガーを使用してこれらのバグを見つけることは事実上不可能です。
Radu094 2009年

1
私の経験では、印刷自体がバグの性質を変更するある種のスレッド同期を引き起こす可能性があるため、マルチスレッドの状況では、印刷ステートメントを追加してもそれほど役に立ちません。
the_mandrill

最初の文を読んだ後、賛成票を投じました
TheIronKnuckle 2013年

6

私の頭の上から:

  1. 複雑なオブジェクトのデバッグ -デバッガーを使用すると、オブジェクトの内部に深く入り込むことができます。たとえば、オブジェクトに複雑なオブジェクトの配列の配列が含まれている場合、printステートメントでは、これまでのところしか取得できません。
  2. 過去のコードをステップ実行する機能 -デバッガーを使用すると、実行したくない過去のコードをスキップすることもできます。確かに、これを手動で行うこともできますが、注入する必要があるコードはそれだけ多くなります。

しかし、コードを挿入したり、迷路のような一連のIDEメニュー選択を理解したりして、「手動」デバッグを使用してこれらの両方を実行できるようになりました。
ビルカーウィン、

はい、できます。しかし、本当にしたいですか?IDEだけで提供されるものではなく、IDEを使用してデバッグする方がよい理由を尋ねました。
Kevin Pang

けっこうだ。メニューの呪文を習得してそれらの機能を使用するとすると、毎回新しいデバッグコードを作成するよりも簡単です。
ビルカーウィン

1
@BillKarwin他のIDEについては不明ですが、Visual Studioでのコード実行をスキップするための「メニューの呪文」はありません。現在の実行ポイントを新しい行に「ドラッグ」するだけです。ブレークポイントを配置するのも同じくらい簡単です(目的の場所の行番号をクリックします。VSで「監視」ウィンドウを表示する以外にメニューに行ったことはないと思います。 1回だけ(または、ウィンドウレイアウトが失われた場合、またはウォッチウィンドウを閉じた場合)
Grant Peters

ヒント@GrantPetersをありがとう!
ビルカーウィン

4

IDEでデバッグする代わりに、次のこと を可能にするphpライブラリを備えた素晴らしいGoogle Chrome拡張PHPコンソールを試すことができます。

  • Chrome JavaScriptコンソールと通知ポップアップでエラーと例外を確認します。
  • 型変数をダンプします。
  • PHPコードをリモートで実行します。
  • パスワードでアクセスを保護します。
  • リクエストごとにコンソールログをグループ化します。
  • テキストエディタでerror file:lineにジャンプします。
  • エラー/デバッグデータをクリップボードにコピーします(テスター用)。

3

私は20年近く開発していませんが、IDE /デバッガーを使用して次のことができることがわかりました。

  • print文に含まれているとは思わなかったかもしれないあらゆる種類のことを見る
  • コードをステップ実行して、コードが進むと思ったパスと一致するかどうかを確認します
  • 変数を特定の値に設定して、コードに特定の分岐を行わせる

良い点!確かに、これらは「編集、再コンパイル、実行」の繰り返しを減らすことができます。
ビルカーウィン、

2

IDEを使用する理由の1つは、最新のIDEが単純なブレークポイント以上のものをサポートしていることです。たとえば、Visual Studioは次の高度なデバッグ機能を提供します。

  • 条件付きブレークポイントを定義する(条件が満たされた場合にのみブレークするか、ブレークポイントのステートメントがn回実行されたときにのみブレークする)
  • 未処理の例外で、または(特定の)例外がスローされるたびに中断する
  • デバッグ中に変数を変更する
  • 実行する次の行を設定してコードの一部を繰り返す

また、デバッガーを使用する場合、デバッグが終了したら、すべての印刷ステートメントを削除する必要はありません。


それらは良い例です。私はそれらを使用する方法を示すまともなチュートリアルや記事を見たことがありません。また、VSやその他のMicrosoftソリューションを使用することはほとんどありません。
ビルカーウィン、

デバッグコードを削除するという雑用は有効ですが、「svn revert」を実行してそれを取り除くことができます。
ビルカーウィン、

#ifdef DEBUG printf( "variable what is now now%d \ n"、var); fflush(標準出力); #endif
Arthur Kalliokoski

@ M4N、バージョンを復元するだけで簡単にできます。
Pacerier、2015年

2

別の回答で見たことがないことに驚いたのは、2つのデバッグ方法が相互に排他的でないということです。

printf標準のデバッガー(IDEベースかどうかに関係なく)を使用している場合でも、デバッグは非常にうまく機能します。特にロギングフレームワークを使用すると、リリースされた製品のすべてまたはほとんどをそのままにして、顧客の問題の診断に役立てることができます。

ここの他のほとんどすべての回答で述べたように、標準デバッガーの重要な優れた点は、プログラムの状態の詳細をより簡単に調査(および場合によっては変更)できることです。何を見たいかを前もって知る必要はありません-それはあなたの指先で(多かれ少なかれ)すべて利用可能です。


もう1つの回答には、相互に排他的ではないポイントが含まれていましたが、それは十分に理解されています。
ビルカーウィン、

2

私の経験では、単純な印刷出力には、誰にも言及されていないように見える大きな利点が1つあります。

IDEデバッガーの問題は、すべてがリアルタイムで発生することです。プログラムを特定の時間に停止してから、ステップを1つずつ進めていきます。突然前に何が起こったかを確認したい場合は、戻ることはできません。これは、私たちの脳がどのように機能するかと矛盾しています。脳は情報を収集し、徐々に意見を形成します。その際、イベントを数回繰り返す必要があるかもしれませんが、いったん特定のポイントを通過すると、戻ることはできません。

これとは対照的に、選択された一連の出力/ログにより、「一時的なイベントの空間投影」が得られます。何が起こったかの完全なストーリーを提供し、上下にスクロールするだけで簡単に数回前と後ろに戻ることができます。「Bが発生する前にAが発生したのか」などの質問に簡単に回答できます。それはあなたが探しているにも関わらず、あなたがたはパターンを見るようにすることができる。

だから私の経験では。IDEとデバッガーは、単一のコールスタックの何かがうまくいかなかった場合の単純な問題を解決し、特定のクラッシュでのマシンの現在の状態を調査するための素晴らしいツールです。

ただし、段階的に状態が変化することが関係する、より困難な問題に取り組む場合。たとえば、あるアルゴリズムがデータ構造を破壊した場合、その結果、anohterアルゴリズムが失敗しました。あるいは、「これがどのくらいの頻度で発生するのか」、「私が想像するとおりに、順序どおりに発生するのか」などの質問に答えたい場合。そして、「古いファシニングされた」ロギング/プリントアウト技術には明らかな利点があります。

最善の方法は、いずれかの手法が最適な場合に使用することです。たとえば、ロギング/プリントアウトを使用していくつかのバグに移動し、ブレークポイントで一時停止して、現在の状態をさらに詳しく調べる必要があります。

ハイブリッドアプローチもあります。たとえば、console.log(object)を実行すると、ログにデータ構造ウィジェットが表示されます。このウィジェットは、展開してより詳細に調べることができます。これは、多くの場合、「デッド」テキストログよりも明らかに有利です。


1

印刷ステートメントを使用してマルチスレッドアプリケーションをデバッグすると、バナナが増えるからです。はい、それでも印刷ステートメントでそれを行うことができますが、それらの多くが必要であり、マルチスレッド実行をエミュレートするためにステートメントの順次印刷を解明するには長い時間がかかります。

残念ながら、人間の脳はシングルスレッドのみです。


そう、印刷文字列の前にスレッド番号などを付けたり、出力をスレッドごとに列にフォーマットしたりできます(多すぎない場合)。しかし、私はあなたの要点を理解します。
ビルカーウィン、

1
もう1つ覚えておかなければならないのは、print()ステートメントがスレッドを同期する場合があることです。デバッグログを有効にするとアプリが正常に動作するという問題をかつて見ましたが、無効にするとすぐにクラッシュし、アプリが印刷時に同期していて、正しく機能することが原因であることがわかりました。
inkredibl 2009年

1
実際、私の経験では、優れたログライブラリと巧妙にフォーマットされた印刷(同期されていない)ステートメントは、いくつかのキラーマルチスレッドバグをデバッグ(および理解)する唯一の方法である場合があります。ブレークポイント(およびコンパイラーによって追加された追加のデバッグシンボル)は、バグの環境を、競合状態を検出、再現、または理解することができないポイントに変更する可能性があります。
Radu094 2009年

1

本へのポインタを求めたので... Windowsデバッグに関する限り、John RobbinsはWindowsデバッグに関する優れた本のいくつかの版を持っています。

Microsoft .NETおよびMicrosoft Windowsのアプリケーションのデバッグ

最新のエディション(Microsoft .NET 2.0アプリケーションのデバッグ)は.NETのみであるため、ネイティブコードのデバッグ(.NETとネイティブの両方をカバー)が必要な場合は、最初のリンクのように古いバージョンが必要になる場合があります。


本のヒントをありがとう!Microsoftプラットフォームで開発を使用することはめったにありませんが、参考文献に感謝します。
ビルカーウィン、

1

個人的には答えは「統合デバッガ/ IDEはコマンドをパンチする必要なしにさまざまな情報をすばやく提供します。情報は何をしているのかわからないまま、目の前にある傾向があります。見せて

簡単に情報を取得するためには、単にコマンドラインのデバッグ、または「printfの」デバッグより良いそれらを作るものです。


これは、提供されている他の多くの回答の具体的な例と一致する、良い要約または一般的なステートメントです。
ビルカーウィン

乾杯ビル。ほとんどの場合、両方のタイプのデバッガーで必要なことを実行できるので、機能と機能の議論は無意味だと思います。統合されたものは、プロセスを非常に単純にします(VSの場合のように、うまく機能している場合)。
OJ。

1

printfに対するデバッガーの利点(IDEデバッガーではなく、すべてのデバッガーに注意してください

  1. ウォッチポイントを設定できます。これは、メモリの破損を見つける私のお気に入りの方法の1つです。

  2. 現在再コンパイルできないバイナリをデバッグできます

  3. 再コンパイルに時間がかかるバイナリをデバッグできます

  4. 変数をその場で変更できます

  5. オンザフライで関数を呼び出すことができます

  6. デバッグステートメットがフラッシュされないため、タイミングの問題を正確にデバッグできないという問題はありません。

  7. デバッガーはコアダンプをサポートしますが、ステートメントを出力することはできません


1

これは、VS.NETデバッグウィンドウで最もよく使用するものです。

  • コールスタックは、他の人のコードを理解するための優れた方法でもあります。
  • ローカル&時計。
  • イミディエイトウィンドウ。基本的にはC#コンソールであり、変数の内容を変更したり、初期化したりすることもできます。
  • 行をスキップする機能。次のステートメントが別の場所で実行されるように設定します。
  • 変数にカーソルを合わせて、その値を示すツールチップを表示する機能。

要約すると、小さなウィンドウではなく、実行中のコードの状態を360度表示できます。

この種のことを教える本を見つけたことはありませんが、繰り返しますが、それは非常に単純なようで、かなりWYSIWYGです。


詳細については、リソースに関する質問の少なくとも一部に対処するための+1。
ビルカーウィン

0
  • デバッガは実行中のプロセスに接続できます

  • 多くの場合、デバッガーからスレッド化されたコードをデバッグする方が簡単です


0

IDEデバッガーを使用すると、実行を停止するたびに、現在のスコープ内のすべての変数の値を確認できます(コールスタック全体)。

print文は素晴らしいが、生成することができます任意の場所で画面にそれほど多くの情報をダンプすることができ、全体 print文の多くを。

また、多くのIDEデバッガーでは、メソッドを入力して評価し、停止中にメンバーを評価できます。これにより、実行する必要がある印刷ステートメントの量がさらに増加し​​ます。

デバッガは他の言語よりもいくつかの言語の方が優れていると思います...

IDEデバッガーは、JavaやC#などのマネージ言語にとっては驚くほど素晴らしいものであり、C ++にとってはかなり有用であり、Pythonなどのスクリプト言語にとってはあまり有用ではないというのが私の一般的な意見です(ただし、私が試したことがなかっただけかもしれません)任意のスクリプト言語用のデバッガー)。

Java開発をするとき、私はIntelliJ IDEAのデバッガーが大好きです。Pythonを使用するときは、printステートメントだけを使用します。


はい、私は動的言語を使用すると再コンパイル手順をスキップできることに同意します。別の診断プリントを追加して、そのまま実行できます。そのような編集のたびに再コンパイルしなければならない場合、動的デバッガーがより多くの時間を節約すると想像できます。
ビルカーウィン、

0

誰かが上で言ったように:デバッガ!= IDE。

gdbと(昔の)TurboDebugger(スタンドアロン)は、サポートする言語で問題なく動作します。ありがとうございます。(またはさらに古いテクノロジー:xBase実行可能ファイル自体にリンクされたクリッパーデバッガー)-これらはどれもIDEを必要としませんでした

また、C / ++コーディングはよりまれですが、printfステートメントは、見つけようとしているまさにそのバグを隠すことがあります!(たとえば、スタック上の自動変数の初期化の問題、またはメモリの割り当て/配置)

最後に、他の人が述べたように、両方を使用できます。いくつかのリアルタイムっぽい問題は、ほとんど印刷、または少なくとも賢明な「* video_dbg =(is_good? '+': '-');」を必要とします。ビデオメモリのどこかに。私の年齢は示しています、これはDOSの下でした:-)

TMTOWTDI


0

他のポスターが言ったことの多くに加えて、私はコンピューターと一緒に一度に1行ずつステップ実行するのが本当に好きです。多くの場合、「次の行」ボタンをクリックしたときに変数の値を確認せざるを得ないので、変数の値を見ることさえせずにバグをキャッチします。しかし、私の答えはあなたに役立つとは思いません、ビル、おそらくあなたはすでにこのスキルを持っているでしょう。

学習リソースに関する限り、私は何も使用していません。すべてのメニューとオプションを調べているだけです。


0

これは本物のプログラマからの本当の質問ですか?

印刷ステートメントを使用したデバッグとIDEを使用したデバッグを5分も費やした人なら誰でも、質問することなくOCCURを実行できます。


これは、「Annon」というモニカを持つ誰かからの面白い質問です。
ビルカーウィン

あなたの中の彼は、彼の知恵がまったく何の価値もないことを知っている最も賢い人です。(ソクラテス)
Jacques de Hooge

0

デバッグにはプリントとIDEの両方を使用しており、IDEを使用してデバッグするほうがはるかに便利です。それがうまくいかないときの唯一の時間は、(オンラインゲームのデバッグのような)タイムクリティカルな状況で、コードを印刷ステートメントで散らかし、それがひどく間違った後にログファイルを見る場合です。それでもそれを理解できない場合は、さらにプリントを追加して繰り返します。


0

IDEのコンソールデバッガーvs printfおよびvsデバッガーの便利な機能について言及したかっただけです。

リモートアプリケーションに接続し(明らかにDEBUGモードでコンパイル)、POSIX teeユーティリティを使用してデバッガーの出力をファイルにダンプし、その状態を検査できます。printfと比較して、実行時に状態を出力する場所を選択できます。

アグレッシブな環境にデプロイされたAdobe Flashアプリケーションをデバッグしていたとき、それは多くの助けとなりました。各ブレークポイントで必要な状態を出力するアクションを定義し、でコンソールデバッガーを起動して、fdb | tee output.logいくつかのブレークポイントをウォークスルーするだけです。その後、ログを印刷し、さまざまなブレークポイントの状態を完全に比較することで情報を分析できます。

残念ながら、この機能[ファイルへのロギング]はGUIデバッガーではほとんど使用できないため、開発者は頭の中でオブジェクトの状態を比較できます。

ちなみに、私の見解では、デバッガを開始する前に、どこで何をデバッグするかを計画する必要があります。


ありがとう!しかし、GUIデバッガーにリモートデバッグ機能がないことに同意するかどうかはわかりません。実際、ほとんどの人がこの機能を備えていますが、セットアップするのはちょっと面倒です。とにかく、あなたはDTraceをチェックアウトしたのでしょうか。
ビルカーウィン、

@ビル・カーウィン:私はファイルにログを記録する機能を意味しました=)
10

0

さらに別のことは、新しい古いプロジェクトに参加し、コードがどのように実行されているかをだれも実際に知らない場合、変数/オブジェクト/ ...をエコーし​​てデバッグすることができないということです。まったく実行されました。

私の仕事では、まさにそのような状況に直面しており、視覚的なXDebuggingは、何がどこで何が起こっているかについてのアイデアを得るのに役立ちます。

宜しくお願いします

ラファエル


0

すでに述べた多くのことに加えて、printfよりもデバッガーの最も重要な利点の1つは、printfステートメントを使用すると、バグが存在する関数がわかっていることが前提となることです。多くの場合そうではないので、ローカライズするために、いくつかの推測を行い、他の多くの関数に印刷ステートメントを追加する必要があります。バグはフレームワークのコードにあるか、またはあなたが思っている場所から遠く離れた場所にある可能性があります。デバッガーでは、ブレークポイントを設定して、コードのさまざまな領域のさまざまな時点での状態を調べる方がはるかに簡単です。

また、適切なデバッガーを使用すると、ブレークポイントに条件とアクションをアタッチしてprintfスタイルのデバッグを実行できるため、printfデバッグの利点を維持できますが、コードを変更する必要はありません。


0

IDEでのデバッグは、共有ホストなど、エラーログやシェルアクセスが利用できない環境では非常に重要です。その場合、リモートデバッガーを備えたIDEが、view stderrやなどの簡単なことを実行できる唯一のツールですstdout


0

printステートメントを使用する際の問題は、コードが混乱することです。IE、10個のパーツを持つ関数があり、どこかでクラッシュすることはわかっていますが、どこにいるかはわかりません。したがって、バグがどこにあるのかを特定するために、10の余分な印刷ステートメントを追加します。バグを見つけて解決したら、これらの印刷ステートメントをすべて削除してクリーンアップする必要があります。多分あなたはそれをするでしょう。多分あなたは忘れるでしょう、そしてそれは最終的に生産になり、そしてあなたのユーザーのコンソールはデバッグプリントでいっぱいになるでしょう。


0

ワウ、私はこの質問が好きですか。私はあえてそれをポーズすることはありませんでした...

人は働き方が違うようです。私にとって最も効果的なのは:

  • メモリ管理を含む、私のコードのしっかりしたマインドモデルを持っている
  • (printステートメントのような)インストルメンテーションを使用して、何が起こっているかを追跡します。

私は40年以上にわたって生涯のプログラミングを行っており、C ++とPythonの重要な技術的および科学的アプリケーションで日々働いており、デバッガーでは少しも役に立たないという個人的な経験があります。

それは良いとは言えません。それが悪いとは言わない。共有したいだけです。


1
なぜこれが良い答えだと思いますか?これはStackoverflowにとって良い質問だと思いますか?
DavidG 2016年

一部の人々にとってデバッガーが最適に機能しないことを受け入れる前に、私はかなり時間がかかりました。私は同じ考え方を持つ他の人がそのポイントに早く到達できるようにしたいと考えています。質問については、タブーが開かれるので参考になると思います...
Jacques de Hooge

私の最初の質問があなたが正しい結論に到達するのに役立つことを望んでいましたが、残念ながらそうではないようです。この質問は主に意見に基づいているため、トピックから外れており、現在は閉じられていることもわかります(回答により、質問がトップページにジャンプし、人々がSOに適していないことに気づいた十分な注意を得ました)。
DavidG 2016年

そのような質問が適切に配置される(高品質の)フォーラム(またはSOのタグ)を知っていますか?
Jacques de Hooge

意見の質問が許可されているSOネットワークの場所はありません。
DavidG 2016年

-2

デバッグだけではありません。IDEは、多くの方法でより良いソフトウェアをより速く構築するのに役立ちます。

  • リファクタリングツール
  • APIをより見つけやすくするため、またはおなじみのアイテムの正確なスペル/ケースを思い出させるためのインテリセンス(同じシステムを15年間使用している場合はあまり使用されませんが、それはまれです)
  • 変数名とクラス名をオートコンプリートすることで、タイピングを節約
  • コンパイルを開始する前に特定の種類のエラーを見つける
  • 同じファイルまたはフォルダー内にない場合でも、変数/メソッド/クラス宣言/定義に自動的にジャンプします。
  • 未処理および処理済みの例外を破る

私は続けることができました。


2
エラー...それは問題ではありませんでした。
vmarquez 2009年

2
これらもすべてIDEの優れた機能ですが、それらのほとんどは「スマート編集」と呼ばれるものと関係があります。スマートエディターの価値は理解していますが、ビジュアルデバッグについて質問しました。
ビルカーウィン

デバッガーをスマートエディターやその他すべての機能と統合することには価値があると私は理解していますが。
ビルカーウィン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.