2012-07-06 44 views
4

在C#中考虑以下语句:反映堆栈跟踪在发布版本中是否危险?

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

这是一个发布版本危险的施工,其中框架可以编译为本地代码?

+2

危险如“崩溃一切”?或者“超级慢”?或“揭示一些秘密信息”?或“返回不同的名称比在调试版本,以便我的代码依赖于它将无法工作”? – Thilo 2012-07-06 12:47:26

+0

[GetCurrentMethod](http://msdn.microsoft.com/zh-cn/library/system.reflection.methodbase.getcurrentmethod.aspx)? – 2012-07-06 13:20:26

回答

1

AFAIK no。无论如何,所有东西都编译成IL。方法将是已知的,你只需要一个pdb文件 - 即使你做了发布版本。

您可以在项目属性中的高级选项设置此

enter image description here

5

不,它不是每说危险,但你可能无法得到所有你从一个建一个发布版本所需的信息没有调试符号。下面是一些MSDN信息:

堆栈跟踪信息将是最翔实与调试生成配置。默认情况下,Debug版本包含调试符号,而Release版本则不包含。调试符号包含构建StackFrame和StackTrace对象时使用的大部分文件,方法名称,行号和列信息。

+0

即使发布版本,您也可以提供pdb文件。 – Aliostad 2012-07-06 12:48:57

+1

@Aliostad,是的,这就是为什么我写了'没有调试符号构建的发布版本,可能有点不清楚。 :) – 2012-07-06 12:50:18

+1

对不起,没看到它:) – Aliostad 2012-07-06 12:53:25

3

该CLR提供了非常强大的堆栈散步保证。必须如此,它们对于使垃圾收集器和代码访问安全性起作用非常重要。你不能指望的是GetFrame(0)为你提供了方法的堆栈框架。内联代码是一个重要的抖动优化。至少不是没有明确地用[MethodImpl]抑制优化,在你的方法中指定MethodImplOptions.NoInlining。

栈走和优化抑制都很昂贵,所以请确保此代码不在关键路径上。

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

0

谢谢你的回复。

我的问题是,我遇到了包含列表声明(访问冲突)的代码的零星崩溃,但没有声明代码已稳定。但由于答复似乎我必须看看其他的东西。

+0

你应该考虑设置一个答案在这个线程? – 2013-03-27 12:15:24