[英]How can I call a function in C++ when I get the WinRT/UWP error 'Activating a single-threaded class from MTA is not supported?'
[英]How can I get a stacktrace from C++ in WinRT?
我需要从C ++应用程序获取stacktrace,并将其序列化为字符串,以便以后可以对其进行解析。 我在Windows上听说过的唯一API是StackWalk64,它似乎不受支持。
如何在Windows Store应用程序中从C ++获取堆栈跟踪?
我能够调试复杂的WINRT问题的唯一方法是使用ETW跟踪因果关系链。 设置起来有点繁琐本文(指的是c#)重点介绍了该方法:
这是对C / C ++的ETW的一些不错的介绍。
使用此方法,您应该能够创建ETW事件,然后在应用程序中侦听它们,并将它们作为序列化字符串包括在内,以便以后进行分析。
对我有用的是下面的asm代码。 这仅在x86平台上有效,因此仅在调试器上调试时有用。 返回的帧指针可在反汇编窗口中使用,以跳入源代码。 我认为应该可以使用地图文件来获取确切的源代码位置。
我使用此代码查找内存泄漏,与crtdbg结合使用,在具有大量分配的大型应用程序中非常有效。 VS 2013内存分析器最多可以处理1分钟的数据记录。
FINLINE static DWORD GetCallerFrameNum(int index) {
#if defined(_DEBUG) && defined(_MSC_VER) && defined(_M_IX86)
DWORD caller = 0;
__asm
{
mov ebx, ebp
mov ecx, index
inc ecx
xor eax, eax
StackTrace_getCaller_next :
mov eax, [ebx + 4]
mov ebx, [ebx]
dec ecx
jnz StackTrace_getCaller_next
mov caller, eax
}
return caller;
#else
return 0;
#endif
}
template<class T>
void RecordStackTrace(T& vecOut) {
vecOut.clear();
vecOut.reserve(32);
for (INT iInitLevel = 1; iInitLevel < 32; ++iInitLevel) {
DWORD dwFrameNum = GetCallerFrameNum(iInitLevel);
if (!dwFrameNum)
return;
vecOut.push_back(dwFrameNum);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.