int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 ppEnum)
{
if (this._id == "")
{
ppEnum = null;
return Constants.S_FALSE;
}
if (this._engine.evaluatedTheseFlags(this._id, dwFieldSpec))
{
ppEnum = new AD7FrameInfoEnum(previousFrameInfoArray);
return Constants.S_OK;
}
// Ask for general stack information.
if ((this._id != "") && (this._id != this._engine.currentThread()._id))
_engine.eDispatcher.selectThread(this._id);
string stackResponse = _engine.eDispatcher.getStackFrames().Replace("#;;;;", "");
if (stackResponse == "")
{
ppEnum = null;
return Constants.S_FALSE;
}
string[] frameStrings = stackResponse.Split('#');
// Query the stack depth without inquiring GDB.
int numStackFrames = frameStrings.Length;
if (numStackFrames > 30) // limiting the amount of stackFrames to avoid VS crashing.
numStackFrames = 30;
ppEnum = null;
try
{
bool created = false;
FRAMEINFO[] frameInfoArray = new FRAMEINFO[numStackFrames];
for (int i = 0; i < numStackFrames; i++)
{
string[] frameInfo = frameStrings[i].Split(';');
if (frameInfo.Length >= 3)
{
if (frameInfo[3].Contains("~"))
{
// Need to lengthen the path used by Visual Studio.
StringBuilder longPathName = new StringBuilder(1024);
GetLongPathName(frameInfo[3], longPathName, longPathName.Capacity);
frameInfo[3] = longPathName.ToString();
}
AD7StackFrame frame = AD7StackFrame.create(_engine, this, frameInfo, ref created);
if (frame.m_thread.__stackFrames == null) // that's weird, but sometimes VS is not initializing __stackFrames, so I added this loop to avoid other problems.
{
while (frame.m_thread.__stackFrames == null)
frame.m_thread.__stackFrames = new ArrayList() { frame };
}
frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]);
}
}
if ((previousFrameInfoArray.Length != frameInfoArray.Length) || (created == true))
{
previousFrameInfoArray = frameInfoArray;
ppEnum = new AD7FrameInfoEnum(frameInfoArray);
}
else
{
bool isEqual = true;
for (int i = 0; i < frameInfoArray.Length; i++)
{
if (frameInfoArray[i].m_bstrFuncName != previousFrameInfoArray[i].m_bstrFuncName)
{
isEqual = false;
break;
}
if (frameInfoArray[i].m_dwValidFields != previousFrameInfoArray[i].m_dwValidFields)
{
isEqual = false;
break;
}
if (frameInfoArray[i].m_bstrLanguage != previousFrameInfoArray[i].m_bstrLanguage)
{
isEqual = false;
break;
}
}
if (!isEqual)
{
previousFrameInfoArray = frameInfoArray;
ppEnum = new AD7FrameInfoEnum(frameInfoArray);
}
else
{
ppEnum = new AD7FrameInfoEnum(previousFrameInfoArray);
}
}
if ((this._id != "") && (this._id != this._engine.currentThread()._id))
_engine.eDispatcher.selectThread(this._engine.currentThread()._id);
return Constants.S_OK;
}
catch (ComponentException e)
{
if ((this._id != "") && (this._id != this._engine.currentThread()._id))
_engine.eDispatcher.selectThread(this._engine.currentThread()._id);
return e.HResult;
}
catch (Exception e)
{
if ((this._id != "") && (this._id != this._engine.currentThread()._id))
_engine.eDispatcher.selectThread(this._engine.currentThread()._id);
return EngineUtils.UnexpectedException(e);
}
}