超初心者でもわかるデバッグ方法How to debug for absolute beginners

間違いなく、ソフトウェア開発者が記述したコードが意図したとおりに動くことはありません。Without fail, the code we write as software developers doesn’t always do what we expected it to do. まったく違うことを行うときさえあります。Sometimes it does something completely different! そのようなことが起きたときの次のタスクは、原因を究明することです。その場合、何時間もただコードを見つめてしまいがちですが、デバッグ用のツールつまりデバッガーを使用する方がはるかに簡単で効率的です。When this happens, the next task is to figure out why, and although we might be tempted to just keep staring at our code for hours, it’s much easier and efficient to use a debugging tool, or debugger.

残念ながら、デバッガーは、コードに存在するすべての問題つまり "バグ" を明らかにしてくれる魔法のようなものではありません。A debugger, unfortunately, isn’t something that can magically reveal all the problems or “bugs” in our code. "デバッグ" とは、Visual Studio のようなデバッグ ツールでコードを 1 ステップずつ実行し、プログラミングが間違っている箇所を正確に発見することです。Debugging means to run your code step by step in a debugging tool like Visual Studio, to find the exact point where you made a programming mistake. 次に、行う必要があるコード修正を理解しますが、多くの場合、デバッグ ツールでは、プログラムの実行を続けながら、一時的に変更してみることができます。You then understand what corrections you need to make in your code, and debugging tools often allow you to make temporary changes so you can continue running the program.

デバッガーを効果的に使用することは、時間をかけて練習して習得しなければならないスキルですが、結局は、すべてのソフトウェア開発者にとって基本的なタスクです。Using a debugger effectively is also a skill that takes time and practice to learn but is ultimately a fundamental task for every software developer. この記事では、デバッグの中核となる原則を紹介し、始めるためのヒントを提供します。In this article, then, we introduce the core principles of debugging and provide tips to get you started.

適切な質問を自問して問題を明確化するClarify the problem by asking yourself the right questions

修正を試みる前に、直面している問題を明確にするのは役に立つことです。It helps to clarify the problem that you ran into before you try to fix it. 既にコードで問題が発生していることでしょう。そうでなければ、ここでデバッグ方法を知ろうなどとしていないはずです。We expect that you already ran into a problem in your code, otherwise you wouldn't be here trying to figure out how to debug it! ですから、デバッグを始める前に、解決しようとしている問題が明らかになっていることを確認してください。So, before you start debugging, make sure you've identified the problem you're trying to solve:

  • コードで何を行おうとしましたか?What did you expect your code to do?

  • 代わりにどのようなことが発生しましたか?What happened instead?

    アプリの実行中にエラー (例外) が発生した場合、それは良いことである可能性があります。If you ran into an error (exception) while running your app, that can be a good thing! 例外とはコードを実行すると発生する予期しないイベントであり、通常は何らかの種類のエラーです。An exception is an unexpected event encountered when running code, typically an error of some kind. デバッグ ツールを使用すると、例外が発生したコード内の場所を正確に特定でき、考えられる修正方法を調査するのに役立ちます。A debugging tool can take you to the exact place in your code where the exception occurred and can help you investigate possible fixes.

    何か他のことが発生した場合は、問題はどのような症状ですか。If something else happened, what is the symptom of the problem? この問題が発生したコード内の場所に、既に心当たりがありますか。Do you already suspect where this problem occurred in your code? たとえば、コードでテキストを表示していて、テキストが正しくない場合は、データが正しくないか、または表示するテキストを設定するコードに何らかのバグがあることがわかります。For example, if your code displays some text, but the text is incorrect, you know that either your data is bad or the code that set the display text has some kind of bug. デバッガーでコードをステップ実行することにより、変数に対するすべての変更を個別に調べて、正しくない値が割り当てられるタイミングと方法を正確に発見できます。By stepping through the code in a debugger, you can examine each and every change to your variables to discover exactly when and how incorrect values are assigned.

前提を調べるExamine your assumptions

バグまたはエラーを調査する前に、特定の結果を想定するに至った前提を考えてください。Before you investigate a bug or an error, think of the assumptions that made you expect a certain result. 隠れた前提や未知の前提があると、デバッガーで問題の原因を究明しようとしても、問題の識別が妨げられる可能性があります。Hidden or unknown assumptions can get in the way of identifying a problem even when you are looking right at the cause of the problem in a debugger. 可能性のある前提のリストは長くなるかもしれません。You may have a long list of possible assumptions! 前提を検討するために自問してみるとよい質問をいくつか次に示します。Here are a few questions to ask yourself to challenge your assumptions.

  • 適切な API を使用していますか (つまり、正しいオブジェクト、関数、メソッド、プロパティ)。Are you using the right API (that is, the right object, function, method, or property)? 意図したものとは異なることを行う API を使用しているかもしれません。An API that you're using might not do what you think it does. (デバッガーで API の呼び出しを調べた後、それを修正するため、ドキュメントに移動して正しい API を確認することが必要な場合があります。)(After you examine the API call in the debugger, fixing it may require a trip to the documentation to help identify the correct API.)

  • API を正しく使用していますか。Are you using an API correctly? 正しい API を使用していても、使い方が正しくない可能性があります。Maybe you used the right API but didn't use it in the right way.

  • コードにタイプミスが含まれていませんか。Does your code contain any typos? 変数名の単純なスペルミスのような一部のタイプミスは、発見するのが難しい場合があります。変数を使用する前に宣言する必要がない言語を使用している場合は、特にそうです。Some typos, like a simple misspelling of a variable name, can be difficult to see, especially when working with languages that don’t require variables to be declared before they’re used.

  • コードの変更を行っており、それは発生している問題に関係がないと想定しましたか。Did you make a change to your code and assume it is unrelated to the problem that you're seeing?

  • オブジェクトまたは変数に含まれると想定した特定の値 (または特定の型の値) が、実際に発生する値と異なっていましたか。Did you expect an object or variable to contain a certain value (or a certain type of value) that's different from what really happened?

  • コードの意図がわかっていますか。Do you know the intent of the code? 通常、他の人のコードをデバッグする方が難しいものです。It is often more difficult to debug someone else's code. 自分のコードではない場合、効率よくデバッグするには、先に時間をかけてコードで行われていることを正確に理解することが必要になる場合があります。If it's not your code, it's possible you might need to spend time learning exactly what the code does before you can debug it effectively.

    Tip

    コードを作成するときは、小さくて動作するコードから始めるようにします。When writing code, start small, and start with code that works! (適切なコードの例を後で示します。)場合によっては、実現しようとしている中心的タスクを示すコードの小さなまとまりから始めた方が、大規模または複雑なコードのセットの修正が容易になります。(Good sample code is helpful here.) Sometimes, it is easier to fix a large or complicated set of code by starting with a small piece of code that demonstrates the core task you are trying to achieve. その後、段階的にコードを変更または追加し、各ポイントでエラーをテストできます。Then, you can modify or add code incrementally, testing at each point for errors.

前提を確認することにより、コード内の問題の発見に要する時間を短縮できます。By questioning your assumptions, you may reduce the time it takes to find a problem in your code. また、問題の解決にかかる時間も削減できます。You may also reduce the time it takes to fix a problem.

デバッグ モードでコードをステップ実行して問題の発生場所を発見するStep through your code in debugging mode to find where the problem occurred

アプリを普通に実行した場合、エラーや不正な結果はコードが実行された後でしか表示されません。When you normally run an app, you see errors and incorrect results only after the code has run. プログラムが理由を示すことなく予期せず終了する可能性もあります。A program might also terminate unexpectedly without telling you why.

デバッガー内でアプリを実行すると ("デバッグ モード" とも呼ばれます)、プログラムの実行中に発生するすべてのことをデバッガーが能動的に監視します。Running an app within a debugger, also called debugging mode, means that the debugger actively monitors everything that’s happening as the program runs. また、いつでもアプリを一時停止して状態を調べた後、コードを 1 行ずつステップ実行して発生するすべてのことを詳しく確認できます。It also allows you to pause the app at any point to examine its state, and to then step through your code line by line to watch every detail as it happens.

Visual Studio でデバッグ モードに入るには、デバッグ ツール バーで F5 キーを使用します (または、[デバッグ] > [デバッグの開始] メニュー コマンドか、[デバッグの開始] ボタン デバッグの開始)。In Visual Studio, you enter debugging mode by using F5 (or the Debug > Start Debugging menu command or the Start Debugging button Start Debugging in the Debug Toolbar). 例外が発生した場合、Visual Studio の例外ヘルパーによって、例外が発生した正確な地点に移動し、他の有用な情報が提供されます。If any exceptions occur, Visual Studio’s Exception Helper takes you to the exact point where the exception occurred and provides other helpful information. コード内で例外を処理する方法の詳細については、デバッグのテクニックとツールに関するページを参照してください。For more information on how to handle exceptions in your code, see Debugging techniques and tools.

例外が発生しなかった場合は、おそらく、コード内で問題を探すべき場所について、開発者によい考えがあることでしょう。If you didn't get an exception, you probably have a good idea where to look for the problem in your code. その場合は、デバッガーで "ブレークポイント" を使用して、コードをより注意深く調べることができます。This is where you use breakpoints with the debugger to give yourself a chance to examine your code more carefully. ブレークポイントは、信頼できるデバッグの最も基本的で重要な機能です。Breakpoints are the most basic and essential feature of reliable debugging. ブレークポイントは、Visual Studio が実行中のコードを一時停止する場所を示します。これにより、変数の値、メモリの動作、コード実行のシーケンスなどを確認できます。A breakpoint indicates where Visual Studio should pause your running code so you can take a look at the values of variables, or the behavior of memory, or the sequence in which code runs.

Visual Studio では、コード行の左にある余白をクリックして、ブレークポイントを簡単に設定できます。In Visual Studio, you can quickly set a breakpoint by clicking in the left margin next to a line of code. または、行にカーソルを置いて、F9 キーを押します。Or place the cursor on a line and press F9.

これらの概念を示すため、既にバグがいくつかあるコード例を使って説明します。To help illustrate these concepts, we take you through some example code that already has several bugs. ここでは C# を使いますが、デバッグ機能は Visual Basic、C++、JavaScript、Python、その他のサポートされている言語にも適用されます。We are using C#, but the debugging features apply to Visual Basic, C++, JavaScript, Python, and other supported languages.

サンプル アプリを作成する (バグを含むもの)Create a sample app (with some bugs)

次に、バグがいくつか含まれるアプリケーションを作成します。Next, we will create an application that has a few bugs.

  1. Visual Studio をインストールし、作成するアプリの種類に応じて、.NET デスクトップ開発ワークロードまたは .NET Core クロス プラットフォーム開発ワークロードをインストールする必要があります。You must have Visual Studio installed and either the .NET desktop development workload or the .NET Core cross platform development workload installed, depending on which app type you want to create.

    Visual Studio をまだインストールしていない場合は、 Visual Studio のダウンロード  ページに移動し、無料試用版をインストールしてください。If you haven't already installed Visual Studio, go to the Visual Studio downloads page to install it for free.

    Visual Studio は既にインストールされていて、ワークロードだけをインストールする必要がある場合は、[ツール] > [ツールと機能を取得] の順にクリックします。If you need to install the workload but already have Visual Studio, click Tools > Get Tools and Features. Visual Studio インストーラーが起動します。The Visual Studio Installer launches. [.NET デスクトップ開発] または [.NET Core クロスプラットフォームの開発] ワークロードを選択し、[変更] を選択します。Choose the .NET desktop development (or .NET Core cross platform development) workload, then choose Modify.

  2. Visual Studio を開きます。Open Visual Studio.

    スタート ウィンドウで、[新しいプロジェクトの作成] を選択します。On the start window, choose Create a new project. 検索ボックスに「コンソール」と入力し、[コンソール アプリ (.NET Framework)] または [コンソール アプリ (.NET Core)] を選択します。Type console in the search box and then choose Console App (.NET Framework) or Console App (.NET Core). [次へ] をクリックします。Choose Next. ConsoleApp-FirstApp のようなプロジェクト名を入力して、[作成] をクリックします。Type a project name like ConsoleApp-FirstApp and click Create.

    上部のメニュー バーで、[ファイル] > [新規作成] > [プロジェクト] の順に選択します。From the top menu bar, choose File > New > Project. [新しいプロジェクト] ダイアログ ボックスの左側のウィンドウで、[Visual C#] の下にある [コンソール アプリ] を選択し、次に真ん中のウィンドウで [コンソール アプリ (.NET Framework)] または [コンソール アプリ (.NET Core)] のいずれかを選択します。In the left pane of the New project dialog box, under Visual C#, choose Console App, and then in the middle pane choose either Console App (.NET Framework) or Console App (.NET Core). ConsoleApp-FirstApp のような名前を入力して、[OK] をクリックします。Type a name like ConsoleApp-FirstApp and click OK.

    [コンソール アプリ (.NET Framework)] または [コンソール アプリ (.NET Core)] プロジェクト テンプレートが表示されない場合は、[ツール] > [ツールと機能を取得] に移動して、Visual Studio インストーラーを開きます。If you don't see the Console App (.NET Framework) or Console App (.NET Core) project template, go to Tools > Get Tools and Features, which opens the Visual Studio Installer. [.NET デスクトップ開発] ワークロードまたは [.NET Core クロスプラットフォームの開発] ワークロードを選択して、[変更] を選択します。Choose the .NET desktop development workload or the .NET Core cross platform development workload, then choose Modify.

    Visual Studio によってコンソール プロジェクトが作成され、ソリューション エクスプローラーの右側のウィンドウに表示されます。Visual Studio creates the console project, which appears in Solution Explorer in the right pane.

  3. Program.cs で、既定のすべてのコードを次のコードに置き換えます。In Program.cs, replace all the default code with the following code:

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApp_FirstApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Welcome to Galaxy News!");
                IterateThroughList();
                Console.ReadKey();
            }
    
            private static void IterateThroughList()
            {
                var theGalaxies = new List<Galaxy>
            {
                new Galaxy() { Name="Tadpole", MegaLightYears=400, GalaxyType=new GType('S')},
                new Galaxy() { Name="Pinwheel", MegaLightYears=25, GalaxyType=new GType('S')},
                new Galaxy() { Name="Cartwheel", MegaLightYears=500, GalaxyType=new GType('L')},
                new Galaxy() { Name="Small Magellanic Cloud", MegaLightYears=.2, GalaxyType=new GType('I')},
                new Galaxy() { Name="Andromeda", MegaLightYears=3, GalaxyType=new GType('S')},
                new Galaxy() { Name="Maffei 1", MegaLightYears=11, GalaxyType=new GType('E')}
            };
    
                foreach (Galaxy theGalaxy in theGalaxies)
                {
                    Console.WriteLine(theGalaxy.Name + "  " + theGalaxy.MegaLightYears + ",  " + theGalaxy.GalaxyType);
                }
    
                // Expected Output:
                //  Tadpole  400,  Spiral
                //  Pinwheel  25,  Spiral
                //  Cartwheel, 500,  Lenticular
                //  Small Magellanic Cloud .2,  Irregular
                //  Andromeda  3,  Spiral
                //  Maffei 1,  11,  Elliptical
            }
        }
    
        public class Galaxy
        {
            public string Name { get; set; }
    
            public double MegaLightYears { get; set; }
            public object GalaxyType { get; set; }
    
        }
    
        public class GType
        {
            public GType(char type)
            {
                switch(type)
                {
                    case 'S':
                        MyGType = Type.Spiral;
                        break;
                    case 'E':
                        MyGType = Type.Elliptical;
                        break;
                    case 'l':
                        MyGType = Type.Irregular;
                        break;
                    case 'L':
                        MyGType = Type.Lenticular;
                        break;
                    default:
                        break;
                }
            }
            public object MyGType { get; set; }
            private enum Type { Spiral, Elliptical, Irregular, Lenticular}
        }
    }
    

    このコードの意図は、銀河の名前、銀河までの距離、銀河の種類をすべて一覧に表示することです。Our intent for this code is to display the galaxy name, the distance to the galaxy, and the galaxy type all in a list. デバッグするには、コードの意図を理解することが重要です。To debug, it is important to understand the intent of the code. 出力で表示する一覧の 1 行の形式を次に示します。Here is the format for one line from the list that we want to show in the output:

    "銀河の名前", "距離", "銀河の種類"galaxy name, distance, galaxy type.

アプリを実行するRun the app

  1. F5 キーを押すか、またはコード エディターの上にあるデバッグ ツールバーの [デバッグの開始] ボタン デバッグの開始 を選択します。Press F5 or the Start Debugging button Start Debugging in the Debug Toolbar, located above the code editor.

    アプリが開始し、デバッガーでは例外は表示されません。The app starts and there are no exceptions shown to us by the debugger. しかし、コンソール ウィンドウに表示される出力は、予想したものではありません。However, the output you see in the console window is not what you expect. 予想される出力を次に示します。Here is the expected output:

    Tadpole  400,  Spiral
    Pinwheel  25,  Spiral
    Cartwheel, 500,  Lenticular
    Small Magellanic Cloud .2,  Irregular
    Andromeda  3,  Spiral
    Maffei 1,  Elliptical
    

    しかし、代わりに次のように表示されます。But, we see this instead:

    Tadpole  400,  ConsoleApp_FirstApp.GType
    Pinwheel  25,  ConsoleApp_FirstApp.GType
    Cartwheel, 500,  ConsoleApp_FirstApp.GType
    Small Magellanic Cloud .2,  ConsoleApp_FirstApp.GType
    Andromeda  3,  ConsoleApp_FirstApp.GType
    Maffei 1, 11,  ConsoleApp_FirstApp.GType
    

    出力とコードを調べると、GType が銀河の種類を格納しているクラスの名前であることがわかります。Looking at the output and at our code, we know that GType is the name of the class that stores the galaxy type. 表示しようとしているのは、実際の銀河の種類 ("Spiral" など) であって、クラス名ではありません。We are trying to show the actual galaxy type (such as "Spiral"), not the class name!

アプリをデバッグするDebug the app

  1. アプリを実行したまま、Console.WriteLine メソッドを呼び出している次のコード行の左側の余白をクリックして、ブレークポイントを設定します。With the app still running, set a breakpoint by clicking in the left margin next to the Console.WriteLine method call in this line of code.

    foreach (Galaxy theGalaxy in theGalaxies)
    {
        Console.WriteLine(theGalaxy.Name + "  " + theGalaxy.MegaLightYears + ",  " + theGalaxy.GalaxyType);
    }
    

    ブレークポイントを設定すると、左側の余白に赤い点が表示されます。When you set the breakpoint, a red dot appears in the left margin.

    出力に問題があるので、出力を設定する前記のコードをデバッガーで調べることによりデバッグを始めます。Because we see a problem in the output, we will start debugging by looking at the preceding code that sets the output in the debugger.

  2. デバッグ ツール バーの [再起動] アプリの再起動 ボタンをクリックします (Ctrl + Shift + F5)。Click the Restart Restart App button in the Debug Toolbar (Ctrl + Shift + F5).

    設定したブレークポイントでアプリが一時停止します。The app pauses at the breakpoint that you set. 黄色の強調表示は、デバッガーが一時停止していることを示します (黄色のコード行はまだ実行されていません)。The yellow highlighting indicates where the debugger is paused (the yellow line of code has not yet executed).

  3. 右側の GalaxyType 変数をポイントし、レンチのアイコンの左側の theGalaxy.GalaxyType を展開します。Hover over the GalaxyType variable on the right, and then, to the left of the wrench icon, expand theGalaxy.GalaxyType. GalaxyType にはプロパティ MyGType が含まれ、プロパティの値が Spiral に設定されていることがわかります。You see that GalaxyType contains a property MyGType, and the property value is set to Spiral.

    変数を調べる

    "Spiral" は、コンソールに出力することを想定していた実際に正しい値です。"Spiral" is actually the correct value you were expecting to print to the console! アプリの実行中にこのコードのこの値にアクセスできるのは、良いスタートです。So it is a good start that you can access this value in this code while running the app. このシナリオでは、正しくない API を使用しています。In this scenario, we are using the incorrect API. デバッガーでコードを実行しながらこれを修正できるかどうかを見ていきます。We will see if we can fix this while running code in the debugger.

  4. 同じコードで、まだデバッグしながら、カーソルを theGalaxy.GalaxyType の最後に置いて、theGalaxy.GalaxyType.MyGType に変更します。In the same code, while still debugging, put your cursor at the end of theGalaxy.GalaxyType and change it to theGalaxy.GalaxyType.MyGType. この変更を行うことはできますが、コード エディターには、このコードをコンパイルできないことを示すエラーが表示されます。Although you can make this change, the code editor shows you an error indicating it can't compile this code.

    構文エラー

  5. [エディット コンティニュ] メッセージ ボックスで、[編集] をクリックします。Click Edit in the Edit and Continue message box. [エラー一覧] ウィンドウにエラー メッセージが表示されるようになります。You see an error message now in the Error List window. エラーでは、'object'MyGType の定義が含まれていないことが示されます。The error indicates that the 'object' doesn't contain a definition for MyGType.

    構文エラー

    各銀河を GType 型のオブジェクト (MyGType プロパティを含みます) で設定しましたが、デバッガーは theGalaxy オブジェクトを GType 型のオブジェクトとして認識していません。Even though we set each galaxy with an object of type GType (which has the MyGType property), the debugger does not recognize the theGalaxy object as an object of type GType. 何が起こっているのでしょうか。What's going on? 銀河の種類を設定しているコードを調べてみます。You want to look through any code that sets the galaxy type. そうすると、GType クラスには確かに MyGType のプロパティがありますが、どこかにおかしなところがあります。When you do this, you see that the GType class definitely has a property of MyGType, but something isn't right. object に関するエラー メッセージが手掛かりになります。言語インタープリターに対しては、種類は GType 型のオブジェクトではなく object 型のオブジェクトとして認識されています。The error message about object turns out to be the clue; to the language interpreter, the type appears to be an object of type object instead of an object of type GType.

  6. 銀河の種類の設定に関するコードを調べると、Galaxy クラスの GalaxyType プロパティが、GType ではなく object として指定されていることがわかります。Looking through your code related to setting the galaxy type, you find the GalaxyType property of the Galaxy class is specified as object instead of GType.

    public object GalaxyType { get; set; }
    
  7. 上記のコードを次のように変更します。Change the preceding code to this:

    public GType GalaxyType { get; set; }
    
  8. デバッグ ツールバーにある [再起動] アプリの再起動 ボタンをクリックし (Ctrl + Shift + F5)、コードを再コンパイルして再起動します。Click the Restart Restart App button in the Debug Toolbar (Ctrl + Shift + F5) to recompile code and restart.

    デバッガーが Console.WriteLine で一時停止したら、theGalaxy.GalaxyType.MyGType をポイントして、値が正しく設定されていることを確認します。Now, when the debugger pauses on Console.WriteLine, you can hover over theGalaxy.GalaxyType.MyGType, and see that the value is properly set.

  9. 左側の余白でブレークポイントの円をクリックしてブレークポイントを削除し (または、右クリックして [ブレークポイント] > [ブレークポイントの削除] を選択)、F5 キーを押して続行します。Remove the breakpoint by clicking on the breakpoint circle in the left margin (or right-click and choose Breakpoint > Delete Breakpoint), and then press F5 to continue.

    アプリが実行して、出力を表示します。The app runs and displays output. 今度は問題ないようですが、1 つ気付いたことがあります。コンソール出力では Small Magellanic Cloud 銀河は Irregular 銀河として表示されるようにしたかったのですが、銀河の種類には何も表示されていません。It looks pretty good now, but you do notice one thing; you expected the Small Magellanic Cloud galaxy to show up as a Irregular galaxy in the console output, but it shows no galaxy type at all.

    Tadpole  400,  Spiral
    Pinwheel  25,  Spiral
    Cartwheel, 500,  Lenticular
    Small Magellanic Cloud .2,
    Andromeda  3,  Spiral
    Maffei 1,  Elliptical
    
  10. このコード行にブレークポイントを設定します。Set a breakpoint on this line of code.

    public GType(char type)
    

    このコードで銀河の種類を設定しているので、それを詳しく調べます。This code is where the galaxy type is set, so we want to take a closer look at it.

  11. デバッグ ツールバーにある [再起動] アプリの再起動 ボタンをクリックして (Ctrl + Shift + F5)、再起動します。Click the Restart Restart App button in the Debug Toolbar (Ctrl + Shift + F5) to restart.

    ブレークポイントを設定したコード行で、デバッガーが一時停止します。The debugger pauses on the line of code where you set the breakpoint.

  12. type 変数をポイントします。Hover over the type variable. S という値が (文字コードの後に) 表示されます。You see a value of S (following the character code). 銀河の種類 Irregular は I で表されることがわかっているので、この値に関心があります。You are interested in a value of I, since you know that is an Irregular galaxy type.

  13. F5 キーを押して、再び type 変数をポイントします。Press F5 and hover over the type variable again. type 変数の値が I になるまで、この手順を繰り返します。Repeat this step until you see a value of I in the type variable.

    変数を調べる

  14. 次に、F11 キーを押します ([デバッグ] > [ステップ イン] またはデバッグ ツール バーの [ステップ イン] ボタン)。Now, press F11 (Debug > Step Into or the Step Into button in the Debug Toolbar).

    F11 キーを押すと、デバッガーは一度に 1 ステートメント進みます (そしてコードを実行します)。F11 advances the debugger (and executes code) one statement at a time. F10 キー (ステップ オーバー) も似たコマンドであり、どちらもデバッガーの使用方法を学習するときに非常に役に立ちます。F10 (Step Over) is a similar command, and both are extremely useful when learning how to use the debugger.

  15. F11 キーを繰り返し押して、値 "I" に対する switch ステートメントでコード行を停止します。Press F11 until you stop on line of code in the switch statement for a value of 'I'. ここで、タイプミスによって問題が発生していることがはっきりします。Here, you see a clear problem resulting from a typo. MyGType を銀河の種類 Irregular に設定するコードに進んで欲しいのですが、デバッガーは代わりにこのコードを完全にスキップして、switch ステートメントの default セクションで一時停止します。You expected the code to advance to where it sets MyGType as an Irregular galaxy type, but the debugger instead skips this code completely and pauses on the default section of the switch statement.

    タイプミスを探す

    コードを調べると、case 'l' ステートメントにタイプミスがあることがわかります。Looking at the code, you see a typo in the case 'l' statement. これは、case 'I' である必要があります。It should be case 'I'.

  16. case 'l' のコードをクリックして、case 'I' に置き換えます。Click in the code for case 'l' and replace it with case 'I'.

  17. ブレークポイントを削除し、[再起動] ボタンをクリックしてアプリを再起動します。Remove your breakpoint, and then click the Restart button to restart the app.

    バグが修正され、予期した出力が表示されます。The bugs are fixed now and you see the Output you expect!

    任意のキーを押してアプリを終了します。Press any key to finish the app.

まとめSummary

問題が見つかったら、デバッガーと F10F11 などのステップ コマンドを使用して、問題のあるコードの領域を探します。When you see a problem, use the debugger and step commands such as F10 and F11 to find the region of code with the problem.

Note

問題が発生しているコードの領域を特定するのが困難な場合は、問題が発生する前に実行されるコードにブレークポイントを設定した後、問題の兆候が現れるまでステップ コマンドを使用します。If it is difficult to identify the region of code where the problem occurs, set a breakpoint in code that runs before the problem occurs, and then use step commands until you see the problem manifest. トレースポイントを使用して、[出力] ウィンドウにメッセージを表示することもできます。You can also use tracepoints to log messages to the Output window. 表示されたメッセージを見る (そして、まだ表示されていないメッセージに注意する) ことで、多くの場合、問題のあるコードの領域を分離できます。By looking at logged messages (and noticing which messages were not yet logged!), you can often isolate the region of code with the problem. このプロセスを複数回繰り返して、絞り込むことが必要な場合があります。You may have to repeat this process several times to narrow it down.

問題のあるコードの領域が見つかったら、デバッガーを使用して調査します。When you find the region of code with the problem, use the debugger to investigate. 問題の原因を見つけるには、デバッガーでアプリを実行しながら問題のあるコードを調べます。To find the cause of a problem, inspect the problem code while running your app in the debugger:

  • 変数を検査し、含まれていなければならない型の値が含まれているかどうかを確認します。Inspect variables and check whether they contain the type of values that they should contain. 不正な値が見つかった場合は、不正な値が設定された場所を探します (値が設定された場所を探すには、デバッガーの再起動、呼び出し履歴の確認、またはその両方が必要な場合があります)。If you find a bad value, find out where the bad value was set (to find where the value was set, you might need to either restart the debugger, look at the call stack, or both).

  • アプリケーションで想定されたコードが実行されているかどうかを確認します。Check whether your application is executing the code that you expect. (たとえば、サンプル アプリケーションでは、銀河の種類を Irregular に設定する switch ステートメントのコードが想定されましたが、タイプミスのためにアプリはそのコードをスキップしていました。)(For example, in the sample application, we expected the code for the switch statement to set the galaxy type to Irregular, but the app skipped the code due to the typo.)

Tip

バグを見つけるにはデバッガーが役に立ちます。You use a debugger to help you find bugs. デバッグ ツールは、コードの意図がわかっている場合にのみ、"自動的に" バグを発見できます。A debugging tool can find bugs for you only if it knows the intent of your code. 開発者がその意図を表現した場合にのみ、ツールはコードの意図を認識できます。A tool can only know the intent of your code if you, the developer, express that intent. それを行う方法は、単体テストを書くことです。Writing unit tests is how you do that.

次の手順Next steps

この記事では、いくつかの一般的なデバッグの概念を学びました。In this article, you've learned a few general debugging concepts. 次は、デバッガーに関する詳細の学習を開始できます。Next, you can start learning more about the debugger.