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;
}
}
/// <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; }