VSNDK.DebugEngine.HandleBreakpoints.handle C# (CSharp) Method

handle() public method

This method manages breakpoints events by classifying each of them by sub-type (e.g. breakpoint inserted, modified, etc.).
public handle ( string ev ) : void
ev string String that contains the event description.
return void
        public void handle(string ev)
        {
            int ini = 0;
            int end = 0;
            switch (ev[1])
            {
                case '0':
                // Breakpoint inserted (synchronous).
                // Example: 20,1,y,0x0804d843,main,C:/Users/xxxxx/vsplugin-ndk/samples/Square/Square/main.c,319,0
                    ini = 3;
                    end = ev.IndexOf(';', 3);
                    m_number = Convert.ToInt32(ev.Substring(ini, (end - ini)));

                    if (ev[end + 1] == 'y')
                        m_enable = true;
                    else
                        m_enable = false;

                    ini = end + 3;
                    end = ev.IndexOf(';', ini);
                    m_addr = ev.Substring(ini, (end - ini));
                    if (m_addr == "<PENDING>")
                    {
                        m_func = "??";
                        EventDispatcher.m_unknownCode = true;
                        m_filename = "";
                        m_line = 0;
                        m_hits = 0;
                        return;
                    }

                    ini = end + 1;
                    end = ev.IndexOf(';', ini);
                    m_func = ev.Substring(ini, end - ini);

                    ini = end + 1;
                    end = ev.IndexOf(';', ini);
                    m_filename = ev.Substring(ini, end - ini);

                    ini = end + 1;
                    end = ev.IndexOf(';', ini);
                    m_line = Convert.ToInt32(ev.Substring(ini, (end - ini)));

                    ini = end + 1;
                    m_hits = Convert.ToInt32(ev.Substring(ini, (ev.Length - ini)));

                    break;
                case '1':
                // Breakpoint modified (asynchronous).
                // Example: 21,1,y,0x0804d843,main,C:/Users/xxxxxx/vsplugin-ndk/samples/Square/Square/main.c,318,1
                    ini = 3;
                    end = ev.IndexOf(';', 3);
                    m_number = Convert.ToInt32(ev.Substring(ini, (end - ini))); ;

                    if (ev[end + 1] == 'y')
                        m_enable = true;
                    else
                        m_enable = false;

                    ini = end + 3;
                    end = ev.IndexOf(';', ini);
                    m_addr = ev.Substring(ini, (end - ini));

                    ini = end + 1;
                    end = ev.IndexOf(';', ini);
                    m_func = ev.Substring(ini, end - ini);

                    // Need to set the flag for unknown code if necessary.
                    if (m_func == "??")
                    {
                        EventDispatcher.m_unknownCode = true;
                    }
                    else
                    {
                        EventDispatcher.m_unknownCode = false;
                    }

                    ini = end + 1;
                    end = ev.IndexOf(';', ini);
                    m_filename = ev.Substring(ini, end - ini);

                    ini = end + 1;
                    end = ev.IndexOf(';', ini);
                    m_line = Convert.ToInt32(ev.Substring(ini, (end - ini)));

                    ini = end + 1;
                    m_hits = Convert.ToInt32(ev.Substring(ini, (ev.Length - ini)));

                    // Update hit count on affected bound breakpoint.
                    m_eventDispatcher.updateHitCount((uint)m_number, (uint)m_hits);

                    break;
                case '2':
                // Breakpoint deleted asynchronously (a temporary breakpoint). Example: 22,2\r\n
                    m_number = Convert.ToInt32(ev.Substring(3, (ev.Length - 3)));

                    break;
                case '3':
                // Breakpoint enabled. Example: 23 (enabled all) or 23,1 (enabled only breakpoint 1)
                    if (ev.Length > 2)
                        m_number = Convert.ToInt32(ev.Substring(3, (ev.Length - 3)));
                    else
                        m_number = 0;  // 0 means ALL breakpoints.

                    break;
                case '4':
                // Breakpoint disabled. Example: 24 (disabled all) or 24,1 (disabled only breakpoint 1)
                    if (ev.Length > 2)
                        m_number = Convert.ToInt32(ev.Substring(3, (ev.Length - 3)));
                    else
                        m_number = 0;  // 0 means ALL breakpoints.

                    break;
                case '5':
                // Breakpoint deleted. Example: 25 (deleted all) or 25,1 (deleted only breakpoint 1)
                    if (ev.Length > 2)
                        m_number = Convert.ToInt32(ev.Substring(3, (ev.Length - 3)));
                    else
                        m_number = 0;  // 0 means ALL breakpoints.

                    break;
                case '6':
                // Break after "n" hits (or ignore n hits). Example: 26;1;100
                    ini = 3;
                    end = ev.IndexOf(';', 3);
                    m_number = Convert.ToInt32(ev.Substring(3, (end - 3)));

                    ini = end + 1;
                    m_ignoreHits = Convert.ToInt32(ev.Substring(ini, (ev.Length - ini)));

                    break;
                case '7':
                // Breakpoint hit.
                // Example: 27,1,C:/Users/xxxxxx/vsplugin-ndk/samples/Square/Square/main.c,319;1\r\n
                    bool updatingCondBreak = this.m_eventDispatcher.engine.m_updatingConditionalBreakpoint.WaitOne(0);
                    if (updatingCondBreak)
                    {

                        m_eventDispatcher.engine.resetStackFrames();

                        ini = 3;
                        end = ev.IndexOf(';', 3);
                        m_number = Convert.ToInt32(ev.Substring(3, (end - 3)));

                        ini = end + 1;
                        end = ev.IndexOf(';', ini);
                        m_filename = ev.Substring(ini, end - ini);

                        ini = end + 1;
                        end = ev.IndexOf(';', ini);
                        m_line = Convert.ToInt32(ev.Substring(ini, (end - ini)));

                        ini = end + 1;
                        m_threadID = ev.Substring(ini, (ev.Length - ini));

                        this.m_eventDispatcher.engine.cleanEvaluatedThreads();

                        // Call the method/event that will stop SDM because a breakpoint was hit here.
                        if (m_eventDispatcher.engine._updateThreads)
                        {
                            m_eventDispatcher.engine.UpdateListOfThreads();
                        }
                        m_eventDispatcher.engine.selectThread(m_threadID).setCurrentLocation(m_filename, (uint)m_line);
                        m_eventDispatcher.engine.setAsCurrentThread(m_threadID);

                        // A breakpoint can be hit during a step
                        if (m_eventDispatcher.engine.m_state == AD7Engine.DE_STATE.STEP_MODE)
                        {
                            HandleProcessExecution.onStepCompleted(m_eventDispatcher, m_filename, (uint)m_line);
                        }
                        else
                        {
                            // Visual Studio shows the line position one more than it actually is
                            m_eventDispatcher.engine.m_docContext = m_eventDispatcher.getDocumentContext(m_filename, (uint)(m_line - 1));
                            m_eventDispatcher.breakpointHit((uint)m_number, m_threadID);
                        }
                        this.m_eventDispatcher.engine.m_updatingConditionalBreakpoint.Set();
                    }
                    break;
                case '8':
                // Breakpoint condition set. Example: 28;1;expression
                    ini = 3;
                    end = ev.IndexOf(';', 3);
                    if (end != -1)
                    {
                        m_number = Convert.ToInt32(ev.Substring(3, (end - 3)));

                        ini = end + 1;
                        m_condition = ev.Substring(ini, (ev.Length - ini));
                    }
                    else
                    {
                        m_number = Convert.ToInt32(ev.Substring(3));
                        m_condition = "";
                    }
                    break;
                case '9':  // Error in testing breakpoint condition
                    break;
                default:   // not used.
                    break;
            }
        }

Usage Example

Exemplo n.º 1
0
        /// <summary>
        /// Code to set the breakpoint in GDB and then confirm and set in Visual Studio
        /// </summary>
        /// <param name="command">Initial command to set the breakpoint in GDB</param>
        /// <param name="GDB_ID">Breakpoint ID in GDB</param>
        /// <param name="GDB_line">Breakpoint Line Number</param>
        /// <param name="GDB_filename">Breakpoint File Name</param>
        /// <param name="GDB_address">Breakpoint Address</param>
        /// <returns>true if successful.</returns>
        private bool setBreakpointImpl(string command1, string command2, out uint GDB_ID, out uint GDB_line, out string GDB_filename, out string GDB_address)
        {
            string response;
            string bpointAddress;
            string bpointStopPoint;

            GDB_ID = 0;
            GDB_filename = "";
            GDB_address = "";
            GDB_line = 0;

            if (VSNDK.AddIn.VSNDKAddIn.isDebugEngineRunning == true)
            {
                prepareToModifyBreakpoint();

                response = GDBParser.parseCommand(command1, 6);

                if ((response.Contains("<PENDING>")) && (command2 != ""))
                    response = GDBParser.parseCommand(command2, 6);

                if ((response.Length < 2) && (VSNDK.AddIn.VSNDKAddIn.isDebugEngineRunning == false))
                {
                    return false;
                }

                HandleBreakpoints hBreakpoints = new HandleBreakpoints(this);
                hBreakpoints.handle(response);
                GDB_ID = (uint)hBreakpoints.number;
                GDB_filename = hBreakpoints.FileName;
                GDB_address = hBreakpoints.Address;

                if ((GDB_address != "<PENDING>") && (GDB_address != ""))
                {                //** Run Code to verify breakpoint stop point.
                    bpointAddress = GDBParser.parseCommand("info b " + GDB_ID.ToString(), 18);
                    bpointStopPoint = GDBParser.parseCommand("info line *" + bpointAddress, 18);

                    GDB_line = (uint)Convert.ToInt64(bpointStopPoint.Trim());
                }
                else
                {
                    GDB_address = "0x0";
                    GDB_line = (uint)hBreakpoints.linePos;
                }

                resumeFromInterrupt();

                return true;
            }
            else
                return false;
        }
All Usage Examples Of VSNDK.DebugEngine.HandleBreakpoints::handle