docs/design/datacontracts/Exception.md
This contract is for getting information about exceptions in the process.
record struct ExceptionData(
TargetPointer Message,
TargetPointer InnerException,
TargetPointer StackTrace,
TargetPointer WatsonBuckets,
TargetPointer StackTraceString,
TargetPointer RemoteStackTraceString,
int HResult,
int XCode);
TargetPointer GetNestedExceptionInfo(TargetPointer exceptionInfoAddr, out TargetPointer nextNestedExceptionInfo, out TargetPointer thrownObjectHandle);
ExceptionData GetExceptionData(TargetPointer exceptionAddr);
Data descriptors used:
ExceptionInfoExceptionTargetPointer GetNestedExceptionInfo(TargetPointer exceptionInfoAddr, out TargetPointer nextNestedExceptionInfo, out TargetPointer thrownObjectHandle)
{
nextNestedExceptionInfo = target.ReadPointer(exceptionInfoAddr + /* ExceptionInfo::PreviousNestedInfo offset*/);
thrownObjectHandle = target.ReadPointer(exceptionInfoAddr + /* ExceptionInfo::ThrownObject offset */);
if (thrownObjectHandle == TargetPointer.Null)
{
return TargetPointer.Null;
}
return target.ReadPointer(thrownObjectHandle);
}
ExceptionData GetExceptionData(TargetPointer exceptionAddr)
{
return new ExceptionData(
target.ReadPointer(exceptionAddr + /* Exception::Message offset */),
target.ReadPointer(exceptionAddr + /* Exception::InnerException offset */),
target.ReadPointer(exceptionAddr + /* Exception::StackTrace offset */),
target.ReadPointer(exceptionAddr + /* Exception::WatsonBuckets offset */),
target.ReadPointer(exceptionAddr + /* Exception::StackTraceString offset */),
target.ReadPointer(exceptionAddr + /* Exception::RemoteStackTraceString offset */),
target.Read<int>(exceptionAddr + /* Exception::HResult offset */),
target.Read<int>(exceptionAddr + /* Exception::XCode offset */),
);
}