IDEなしでどのようにデバッグしますか?[閉まっている]


61

IDE(現在はGoをいじっています)を探すたびに、Vi、Emacs、Notepad ++などを推奨する人でいっぱいのスレッドが見つかります。

IDE以外で開発を行ったことはありません。私は甘やかされてきたと思います。IDEなしでどのようにデバッグしますか?ロギングのみに制限されていますか?


53
私が知る限り、オールドスクールのprintfスタイルのデバッグ:
アンドリューウォルターズ

25
IDEが登場する前は、実行中のプロセスにアタッチするか、プロセスをラップしてデバッガーを使用して、プログラムの状態のステップ実行またはイントロスペクションを可能にしました。(gdb、perl -dなど)デバッガーをIDEに統合すると便利ですが、別々に存在します。失敗したデバッガー、ロギング...ロギングによってプログラムの状態が変更されないことを確認し、見つけようとしていたバグを再導入します。

7
コマンドラインデバッガー(いくつかのIDEデバッガーはそれらに基づいています)
ラチェットフリーク

14
ゆっくりと慎重に。
FrustratedWithFormsDesigner

3
プリントは非常に一般的ですが、その使用により、競合状態などのより微妙なバグを隠すことができます。
ジェームズ

回答:


86

デバッガーを使用する。ほとんどの場合、これはIDEが舞台裏で行うことでもあり、GUIでエクスペリエンスをラップするだけです。

Unixでは、最も一般的に使用されるデバッガーの1つはGNUですgdb。これは、などの初期のUnixデバッガーに大きく取って代わりましたdbx

コマンドラインからデバッグがどのように/どのように感じられるかを知るには、gdbのマニュアルをご覧ください。

他の領域と同様に、コマンドラインからデバッガーを使用するには、構文と一連のコマンドを学習する必要がありますが、多くの柔軟性とスクリプト可能性をもたらします。一方、vimやemacsなどのエディターでの作業に慣れている場合は、お気に入りのエディターにお気に入りのデバッガー用のプラグインがあることがわかります。


18
「デバッガーを使用して」の場合は+1。IDEのIは「Integrated」の略です:)
joshin4colours

1
Pythonで書く場合、pdb実際に私が見つけたどのIDEデバッガよりも優れています。
-asthasr

1
@syrionそしてそれipdbよりも良い;)
イズカタ

素晴らしい-存在することは知らなかった、イズカタ。ありがとう。
-asthasr

@ joshin4colours統合!=コレクション、ない?
コールジョンソン

35

グラフィックドライバーを書いている間、私は数年間デバッガーを使用しました。最初のコンピューターに対してデバッガーを実行する2番目のコンピューターがありました(グラフィックスドライバーが壊れたときにプライマリコンピューターの画面が機能しないため)。コードを停止し、ハードウェアを停止するまで踏み込んで、何が起きているのかを知ることが重要でした。

純粋にソフトウェアの問題については、コードを1行ずつステップ実行するよりも、問題について考え、システムをテストして問題の詳細を調べる方がはるかに便利であることがわかりました。printステートメントを使用すると、コマンドラインまたはログファイルで発生したすべてのリストが表示され、デバッガーを使用した場合よりも簡単に前後に移動して、発生した内容を確認および再構築できます。

最も難しいバグは通常、コンピューターから離れたところで問題を理解することで解決されます。ときどき紙やホワイトボードを使ったり、何かをしているときに答えが明らかになることもあります。最も厄介なバグは、Where's Waldoのようなコードを注意深く見ることで解決されます。残りはすべて、printステートメントまたはロギングステートメントを使用すると最も簡単に思えます。

人によってスタイルが異なり、タスクごとにスタイルが異なる方が適しています。印刷ステートメントは、必ずしもデバッガーからのステップダウンではありません。あなたが何をしているのかにもよりますが、彼らはさらに良くなることができます。特に、ネイティブデバッガーがない言語(Goを使用しますか?)。


7
この。絶対これ。少なくとも私にとって、問題は、デバッガーがそれ以上明らかにしない論理エラーまたは相互作用である傾向があることがわかりました。だけではなく、なぜ何かがうまくいかないのを理解する必要があります。
偽の名前

2
完全に+1 going backwards。私は頻繁に経験を持っている:「!ねえ- waittaminuteが、これは正しい値ではありませんでしたどのようにこれはなるこれを?」、およびコードを読みながら出力に前後に行かなければなりません。デバッガーは逆方向が苦手です。
イズカタ

はい、gdbはダンプされたコアを調べるのに適していますが、そのような状況では、printステートメントの無償使用が本当に役立つことがわかりました。
ブライアン

デバッガーは便利ですが、短命です。優れたロギングフレームワークがあれば、デバッグセッションを構築できます。デバッガを使用して状況を理解し、printステートメントで補完してデバッグセッションを永続化します。時間の経過とともにデバッガーの訴えが減り、生産性が
向上することがわかりました

はい、一枚の紙やホワイトボードで考えるか、頭の中で考えることがデバッグの最良の方法です。多くの場合、思考プロセスを修正します。デバッガは、プログラムでバグが発生する理由に関して元の問題を解決できない場合がある簡単な方法である場合があります。)
Nishant

11

コマンドラインでgdbまたはプラグインを使用する人もいますDDDのような、gdbへのスタンドアロンGUIフロントエンドもあります。お使いの言語に応じて、言語固有のスタンドアロンデバッガなどのGUIの、あるWinpdbのpythonのため、またはjswat Java用に。これらのプロジェクトはデバッグのみに焦点を当てているため、多くの場合、統合デバッガよりも優れています。

IDEに関する他の汚い小さな秘密は、それらすべてがカスタムエディターを指定できるので、IDEの一部を特定のタスクに使用できますが、編集には適切なエディターを使用できることです。IDEを起動してデバッガーを使用することは珍しいことではありません。特に同僚が使用している場合はそうです。


1
+1もちろん、他のオプションは、IDEのエディターで配色とキーバインドを設定し、ふりをすることです:)
darvids0n

1
@ darvids0n、私は20年以上にわたってIDEを使用してきましたが、エディタを備えたものを見つけるために、まだ来ているかもしれないことを示唆しているかもしれません。 GNU Emacsへのろうそくを持ちます。
ジョンR.ストローム

6

一部の言語ではREPLが提供されます。つまり、コードを1行ずつ記述して実行することができます。これは、コードの検証の最初のステップになります。これらの多くは、デバッグ機能も提供します。HaskellのGHCにはGHCiが付属しており、IDEの場合と同様に、コマンドラインでプログラムをインタラクティブにデバッグするために使用できます。


2

printfステートメントを使用したデバッグに嫌悪感がある理由がわかりません。プログラムの再コンパイルとリンクに時間がかかりすぎていた時期がありましたが、今日ではほんの数秒しかかかりません。cout、printf、qDebug()などのタイプの出力を使用してデバッグするのは非常に簡単です。Printfステートメントは、プログラムが実行したすべての実行履歴を提供します。これは事後に分析できますが、デバッガーで実行すると、実行中のプログラムのフローを手動で記憶する必要があります。printfを使用すると、変数の値を特定の単位に変換し、16進数、10進数などで表示できます。printfステートメントは、ルーチンと変数の名前、および行番号もリストできます。他の変数に応じて、特定の配列要素のみをリストできます。インダイレクションに従うことができます。出力を非常に簡単に制御できますが、カウンターに入れて、ループで特定の時間だけ印刷し、デバッグ中に印刷ステートメントを追加および削除し、さまざまなレベルのデバッグ出力を持ち、ファイルに書き込みます。ファイルに書き込まれたプログラムの履歴を見るのは、手動でステップスルーしたすべての場所を覚えてみてください。また、プログラムが何をしたかを知るために、変数の内容を時間の経過とともに書き留める必要があります。そして最後に、printfステートメントを使用すると、それらを永続的に残して、オンとオフを切り替えて、将来のデバッグに使用できます。手動でステップスルーしたすべての場所を記憶しようとするよりも、ファイルに書き込まれたプログラムの履歴を確認する方がはるかに簡単です。完了しました。そして最後に、printfステートメントを使用すると、それらを永続的に残して、オンとオフを切り替えて、将来のデバッグに使用できます。手動でステップスルーしたすべての場所を記憶しようとするよりも、ファイルに書き込まれたプログラムの履歴を確認する方がはるかに簡単です。完了しました。そして最後に、printfステートメントを使用すると、それらを永続的に残して、オンとオフを切り替えて、将来のデバッグに使用できます。


3
「プログラムの再コンパイルとリンクに時間がかかりすぎていた時期がありましたが、今日ではほんの数秒しかかかりません」。プロジェクトの言語とサイズに依存します。現在のプロジェクトでヘッダーファイルを変更した場合、256GB RAMを搭載した32 CPUマシンで再構築するのに約65分かかります(冗談ではありません)
Nemanja Trifunovic

印刷ステートメントを使用したデバッグに対する「嫌悪感」はありません。デバッガを好むだけです。私は、printfsを使用してデバッグしない「デバッガーの人々」よりも、デバッガーを使用しない「printfの人々」を多く知っています。
カールビーレフェルト

1
十分に分散されたシステムにデバッガを使用することは驚くほど困難ですが、ログを相関させることは可能です(クロック同期の問題のために多少の不正確さがあります)。ソフトウェアシステムが100の異なるマシンで実行されているバイナリで構成されている場合、ログ/「printfデバッグ」は、デバッガを使用して、他の問題を引き起こさない十分なロックステップですべてを維持しようとするよりも簡単です。
バティーン

2

jimwiseはこの質問に非常によく答えましたが、完全なIDEなしで作業することを選択した場合、Microsoftが提供するWindows用のコマンドラインデバッガーはCDBと呼ばれます。CDBには、Windows SDKをダウンロードするときに、GUIに相当するWinDBGなど、他のいくつかのツールが付属しています。


4
それが尋ねられた質問にどのように答えるかを詳細に説明していただけますか?
グナット

あなたは正しいです、それ自体は質問に答えません。@jimwiseの答えは質問に対する良い答えだと感じましたが、Windows用のコマンドラインデバッガの場所に関する情報は含まれていませんでした。それで、私はこれに遭遇し、Windowsでそれを行う方法を疑問に思っている人のために追加の答えに取り組むだろうと考えました。答えを更新して、できるだけ多くのことを言います。
ドリューマーシュ

2

私は通常、デバッガを使用しません。おそらく数週間に1回ですが、最初に行くものではありません。

私の仕事で最も重要なツールはどこにでもあるので、言及するのをほとんど忘れていました。スタックトレースです。スタックトレースを調べることで、遭遇する問題の90%以上を解決できます。このツールは、言語によっては必ずしも役立つとは限りませんが、言語によって適切に実装されている場合、驚くほどの時間を節約できます。

単純な問題を検出する2番目の最も一般的な方法は、おそらく変更したばかりのコードだと思います。私はユニットテストを非常に頻繁に実行しているので、私は一般に私がちょうど壊したことを知っています。

より複雑な開発とデバッグのために、デバッグまたはトレースレベルのログステートメントを追加する場合があります。開発の問題は、実稼働トレース/デバッグロギング情報を配置するのに役立つ良いガイドであると考えています。

常に便利なデバッガーがあるわけではありません。実稼働環境では、デバッガーを実行できない場合があります(たとえば、会社の安全性によっては、ログ以外の実稼働マシンにアクセスできない場合があります)。また、デバッガーの接続に時間がかかりすぎる言語や、使用可能な良いデバッガーがない言語もあります。

ロジックとデバッグ/トレースレベルのログを使用してずっとコーディングしてきた場合は、単に優れたログステートメントを調べて(場合によってはログレベルを上げて)、ハードウェアにアクセスしなくても問題を把握することができます。

デバッガは強力なツールだと思いますが、ツールボックス内の唯一のツールにしないでください!


1

スタンドアロンのテキストエディターと一緒にIDEでデバッガーを使用できない理由はありません。私は、!Zapを使用して編集し、JBuilderを使用して別のマシンでデバッグし、地下のファイルサーバーを使用していました。従来、デバッガはIDEに沿ってドラッグすることのないスタンドアロンプ​​ログラムでしたが、これも機能します。

包括的なテストがデバッグに取って代わることに注意してください。報告されたバグは、コードではなくテストのバグであると考える価値があります。

もありprintfます。すべての行で停止するのではなく、大量の「ログ」を作成して検索すると便利です。実稼働環境では変更できないライブラリクラスを変更できる場合、たとえば-Xbootclasspath/p:Javaライブラリクラスのハッキングに使用すると、特に便利です。


「包括的なテストはデバッグに取って代わることに注意する価値があります。」-「変位」ではなく、「削減」と言います。TDDを実行する場合でも、たとえば、テストが完全に予期しない結果を提供する場合、デバッガーを介してコードを実行することが有益な場合があります。あなただけの書いたコードで、それはあなたがあなたの前のテストのエッジケースを見逃していること、それは...起こるん
ジュール・

1

ペンと紙を使って、または単に問題について考えるだけで、コンピューターから離れて最高の問題を解決できることに同意します。これは、ライブデバッガーを使用するよりも便利です。多くの場合、思考プロセスを修正します。

シンプルなユーザーインターフェイスを備えたコンソールであるpudbを使用できます。REPLを入力して詳細を調べる場合は、pdbやipdbなどの好みのデバッガーを選択できます。

また、利用可能なツールのより包括的なコレクションについては、PythonDebuggingTools Wiki を確認してください。


元々の質問は、GoではなくPythonについてでした。
TMN

そう、どういうわけか私はそれを見逃した。Pythonデバッガーをチェックしていたときに検索で出てきました。
Nishant
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.