【问题标题】:Get Current Call Stack获取当前调用堆栈
【发布时间】:2014-04-26 04:32:47
【问题描述】:

是否有可能在不引发异常的情况下获取 Windows 商店应用程序中的当前调用堆栈?

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

我为什么需要这个

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

我想在分配纹理时将调用堆栈附加到纹理。在某些程序使用后,我打印了所有尚未释放的纹理的调用堆栈。

应该很容易看到我忘记释放纹理的位置。

【问题讨论】:

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


【解决方案1】:

没有像 .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 构建中编译函数。

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2010-11-07
    相关资源
    最近更新 更多