Managing Breakpoints Programmatically

Posted by: Sankar Ramasubbu 

As as extension of my earlier post, I am going to show you how to automate the following breakpoint operations: Enable, Disable and Delete. This post assumes that you have downloaded an image to a device and it has booted up completely. Please refer to Automating the download of a run-time image for details on downloading an image to a device. If you want details on how to automate setting breakpoints please look at my earlier post.

The sample in this post will show you how to automate the following operations:

1. Disable all breakpoints

2. Enable all breakpoints

3. Disable a specific breakpoint

4. Enable a specific breakpoint

5. Delete a specific breakpoint

Add the following references for this sample to work:

  1. System.Windows.Forms
  2. Interop.Microsoft.PlatformBuilder.Diagnostiocs(found in C:\Program Files\Microsoft Platform Builder\6.00\cepb\IdeVS on my machine)

You need the breakpoint template object for any breakpoint operation, which you can get to as follows:

    // Get the debugger object model

    diagnostics = (CCeSystemDiagnostics)dte.GetObject("Yamazaki-OM");

    // Get the runState Control

    runState = (CcsdRunStateControl)diagnostics.GetRunStateControl();

    // Get the breakpoint Templates object

    breakpointTemplates = (csdBreakpointTemplates)runState.GetBreakpointTemplates();

 

Please keep the breakpoint list window open (use menu Debug->Windows->Breakpoints) before executing this sample. Here is the complete sample that shows the various breakpoint operations:

namespace BreakpointsOperationsSample

{

    // Standard namespaces

    using System;

    using System.Collections;

    using System.Collections.Generic;

    using System.Text;

    using System.Windows.Forms;

    // PlatformBuilder and Visual Studio namespaces

    using EnvDTE;

    using EnvDTE80;

    using Interop.Microsoft.PlatformBuilder.Diagnostics;

    using Microsoft.PlatformBuilder.Test;

    internal static class BreakpointOperationsSample

    {

        /// <summary>

        /// The caption to use in message boxes

        /// </summary>

        private const string Caption = "PB - Breakpoint Operations Sample";

        /// <summary>

        /// Debugger Object

        /// </summary>

        private static CCeSystemDiagnostics diagnostics;

        /// <summary>

        /// Run State Object

        /// </summary>

        private static CcsdRunStateControl runState;

 

        /// <summary>

        /// Set a breakpoint

        /// </summary>

        /// <param name="function">Function name</param>

        private static void SetBreakpoint(string function)

        {

            try

            {

                // Get the break point property object and set the Function Name property to where you want the breakpoint

                csdPropertyBag breakpointPropertyBag = (csdPropertyBag)diagnostics.GetPropertyBag();

                breakpointPropertyBag.Set("FunctionName", function);

                // Get the breakpoint templates object and add a new breakpoint

                CcsdBreakpointTemplates breakpointTemplates = (CcsdBreakpointTemplates)runState.GetBreakpointTemplates();

                breakpointTemplates.NewElement((IcsdPropertyBag)breakpointPropertyBag);

            }

            catch (Exception e)

            {

                MessageBox.Show(e.Message, Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

            return;

        }

        /// <summary>

        /// Get breakpoint Template for a given index

        /// </summary>

        /// <param name="Number">Breakpoint index</param>

        /// <returns>Breakpoint Template for the given index</returns>

        private static CcsdBreakpointTemplate GetBreakpointTemplate(int Number)

        {

            CcsdBreakpointTemplate breakpointTemplate;

            // Get the breakpoint templates object, to get to the required breakpoint template

            CcsdBreakpointTemplates breakpointTemplates = (CcsdBreakpointTemplates)runState.GetBreakpointTemplates();

// Walk through the breakpoint templates list, until we get to the required breakpoint template

            IEnumerator enumBreakpoint = (IEnumerator)breakpointTemplates._NewEnum;

            enumBreakpoint.MoveNext();

            int Count = 1;

            while ((breakpointTemplate = (CcsdBreakpointTemplate)enumBreakpoint.Current) != null)

            {

                if (Count == Number)

                    return (breakpointTemplate);

                Count++;

                enumBreakpoint.MoveNext();

            }

            return null;

        }

        /// <summary>

        /// Wait for the debugger to reach break state

        /// </summary>

        /// <param name="run"></param>

        static void WaitForBreak(int timeOut)

        {

            try

            {

                for (int i = 0; i < timeOut; i++)

                {

                    csdHaltReason haltReason = csdHaltReason.csdHaltReasonStepComplete;

                    object oBreakpoint = null;

                    object oException = null;

                    byte phase = 0;

                    csdTriState state;

                    System.Threading.Thread.Sleep(1000);

                    // get the current state of the debugger

   state = runState.GetCurrentRunState(ref haltReason, ref oBreakpoint, ref oException, ref phase);

                    // return if the debugger is in break state

                    if (state == csdTriState.csdTriStateTrue)

                        return;

                }

                MessageBox.Show("ERROR: Debugger did not reach break state in 60 seconds", Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

            catch (Exception e)

            {

  MessageBox.Show(e.Message, Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

        }

       

        /// <summary>

        /// Wait for the debugger to reach run state

        /// </summary>

        /// <param name="run"></param>

        static void WaitForRun(int timeOut)

        {

            try

            {

                for (int i = 0; i < timeOut; i++)

                {

                    csdHaltReason haltReason = csdHaltReason.csdHaltReasonStepComplete;

                    object oBreakpoint = null;

                    object oException = null;

                    byte phase = 0;

                    csdTriState state;

                    System.Threading.Thread.Sleep(1000);

                    // get the current state of the debugger

                    state = runState.GetCurrentRunState(ref haltReason, ref oBreakpoint, ref oException, ref phase);

                    // return if the debugger is in run state

                    if (state == csdTriState.csdTriStateFalse)

                        return;

                }

                MessageBox.Show("ERROR: Debugger did not reach run state in 60 seconds", Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

            catch (Exception e)

            {

                MessageBox.Show(e.Message, Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

        }

        /// <summary>

        /// Sample that illustrates Enable, Disable and Delete breakpoints

        /// </summary>

        public static void BreakpointOperationsSample()

        {

            // Get the debugger object model

            diagnostics = (CCeSystemDiagnostics)dte.GetObject("Yamazaki-OM");

            // Get the runState Control

            runState = (CcsdRunStateControl)diagnostics.GetRunStateControl();

            // Get the breakpoint Templates object

            CcsdBreakpointTemplates breakpointTemplates = (CcsdBreakpointTemplates)runState.GetBreakpointTemplates();

       // Go to break state, to ensure that the breatpoint we set is instantiated immediately

            runState.Break();

            // Wait until debugger reaches break state

            WaitForBreak(60);

            // Set a breakpoint on the function named DoHelp; which is defined in the module shell.exe

            SetBreakpoint("DoHelp");

            // Set a second breakpoint on the function named FindCommand; which is defined in the module shell.exe

            SetBreakpoint("FindCommand");

            MessageBox.Show("In breakpoint list window verify there are two break points and both are enabled.", Caption, MessageBoxButtons.OK, MessageBoxIcon.Information);

                   

            // Disable all breakpoints

    breakpointTemplates.DisableAll();

            MessageBox.Show("In breakpoint list window verify that all breakpoints are disbled.", Caption, MessageBoxButtons.OK, MessageBoxIcon.Information);

            // Enable all breakpoints

            breakpointTemplates.EnableAll();

            MessageBox.Show("In breakpoint list window verify that all breakpoints are enabled.", Caption, MessageBoxButtons.OK, MessageBoxIcon.Information);

            // Disable the second breakpoint

            CcsdBreakpointTemplate breakpointTemplate = GetBreakpointTemplate(2);

            breakpointTemplate.Disable();

            MessageBox.Show("In breakpoint list window verify that the second breakpoint is disbled.", Caption, MessageBoxButtons.OK, MessageBoxIcon.Information);

            // Enable the second breakpoint

            breakpointTemplate.Enable();

            MessageBox.Show("In breakpoint list window verify that the second breakpoint is enabled.", Caption, MessageBoxButtons.OK, MessageBoxIcon.Information);

            // Delete the second breakpoint

            breakpointTemplate.Delete();

            MessageBox.Show("In breakpoint list window verify that the second breakpoint is deleted.", Caption, MessageBoxButtons.OK, MessageBoxIcon.Information);

            // Delete the first breakpoint

            breakpointTemplate = GetBreakpointTemplate(1);

            breakpointTemplate.Delete();

            MessageBox.Show("In breakpoint list window verify that the first breakpoint is deleted.", Caption, MessageBoxButtons.OK, MessageBoxIcon.Information);

            // Run so that the debugger is in run state again

            runState.Run(true);

        }

    }

}

Now as the above sample shows you can automate most of the breakpoint tasks.