在发布版本中反映堆栈跟踪是否危险?

时间:2012-07-06 12:44:59

标签: c# .net clr

在C#中考虑以下声明:

string operation = new StackTrace(false).GetFrame(0).GetMethod().Name;

在发布版本中,这是一个危险的构造吗?框架可以编译为本机代码吗?

4 个答案:

答案 0 :(得分:5)

不,这并不危险,但你可能无法从没有调试符号构建的发布版本中获得所需的所有信息。以下是MSDN的一些信息:

  
    

StackTrace信息将为Debug构建配置提供最丰富的信息。默认情况下,Debug构建包括调试符号,而Release构建则不包括。调试符号包含构造StackFrame和StackTrace对象时使用的大部分文件,方法名称,行号和列信息。

  

答案 1 :(得分:3)

CLR为堆栈遍历提供了非常强有力的保证。必然如此,它们对于使垃圾收集器和代码访问安全性工作非常重要。然而你不能指望的是GetFrame(0)为你提供了方法的堆栈框架。内联代码是一种重要的抖动优化。至少没有用[MethodImpl]显式地抑制优化,在方法上指定MethodImplOptions.NoInlining。

堆栈遍历和优化抑制都很昂贵,因此请确保此代码不在关键路径上。

此功能的编译器支持将添加到下一版本的C#,版本5,[CallerMemberName] attribute

答案 2 :(得分:1)

AFAIK no。

无论如何,一切都汇编到了IL。方法将是已知的,您只需要一个pdb文件 - 即使您进行了发布构建。

您可以在项目属性的高级选项

中进行设置

enter image description here

答案 3 :(得分:0)

感谢您的回复。

我的问题是我遇到了包含列出的语句(访问冲突)的代码偶发崩溃,但是没有声明代码已经稳定。但由于回复,似乎我必须看看其他的。