获取当前呼叫堆栈

时间:2014-03-19 17:53:20

标签: c# windows-8 windows-runtime windows-store-apps callstack

是否有可能在Windows应用商店中获取当前的调用堆栈,而不会抛出异常?

我找到了this answer,但它并不适用于Windows应用商店。

为什么我需要这个

我需要调用堆栈,因为我有一个DirectX纹理内存泄漏。

我想在分配它时将调用堆栈附加到我的纹理。在一些程序使用之后,我打印了尚未解除分配的所有纹理的callstack。

应该很容易看到我忘记取消分配纹理的位置。

1 个答案:

答案 0 :(得分:6)

没有记录的方法来获取对.NET中存在的当前堆栈的访问权限(与StackFrame一样)。

您可以尝试通过创建记录操作的函数来自己维护执行的日志或记录。这需要一点点粘贴功能:

[Conditional("DEBUG")]
void Log(string message, 
      [CallerMemberName] string member = "", 
      [CallerFilePath] string path = "", 
      [CallerLineNumber] int line = 0 ) {
    Debug.WriteLine(string.Format("{0}\t{1}:{3} ({2}) ", 
         message, member, path, line));
}

使用...

Log("hello!");

会产生:

hello!  MainPage_Loaded:45 (c:\Dev\Projects\Win8AppTest\MainPage.xaml.cs) 

上面的函数使用了几个可以使用的相对较新的属性。例如:CallerMemberName。该函数获取调用者的方法或属性名称。

Conditional属性只表示只编译DEBUG版本中的函数。