HRESULT DumpStackEx(IDebugSymbols *symbols, IDebugAdvanced2 *advanced2, IDebugControl4 *control4)
{
HRESULT hr = S_OK;
CONTEXT _context = { 0 };
ULONG _uOutSize = 0;
hr = advanced2->Request(DEBUG_REQUEST_TARGET_EXCEPTION_CONTEXT,
NULL, 0, &_context, sizeof(CONTEXT), &_uOutSize);
if(FAILED(hr))
{
goto cleanup;
}
DEBUG_STACK_FRAME _stackFrames[256] = { 0 };
CONTEXT _frameContexts[256] = { 0 };
ULONG _uFramesFilled = 0;
hr = control4->GetContextStackTrace(&_context, sizeof(_context), _stackFrames, ARRAYSIZE(_stackFrames),
_frameContexts, 256 * sizeof(CONTEXT), sizeof(CONTEXT), &_uFramesFilled);
if(FAILED(hr))
{
goto cleanup;
}
printf("Stack Trace:\n");
for(ULONG _uFrame = 0; _uFrame < _uFramesFilled; _uFrame++)
{
HRESULT symhr;
char _name[512];
unsigned __int64 offset = 0;
ULONG _uLineNo = 0;
ZeroMemory(_name, ARRAYSIZE(_name));
symhr = symbols->GetNameByOffset(_stackFrames[_uFrame].InstructionOffset,
_name, ARRAYSIZE(_name) – 1, NULL, &offset);
if(SUCCEEDED(symhr))
{
printf("%s+0x%I64X", _name, offset);
}
else
{
printf("0x%08I64X", _stackFrames[_uFrame].InstructionOffset);
}
ZeroMemory(_name, ARRAYSIZE(_name));
symhr = symbols->GetLineByOffset(_stackFrames[_uFrame].InstructionOffset,
&_uLineNo, _name, ARRAYSIZE(_name) – 1, NULL, NULL);
if(SUCCEEDED(symhr))
{
printf(" [%s(%u)]", _name, _uLineNo);
}
printf("\n");
}
cleanup:
return hr;
}
Austin.D @ Autodesk