繁体   English   中英

如何在WinRT中从C ++获取堆栈跟踪?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM