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