4

在 C# 中考虑以下语句:

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

这是发布版本中的危险构造,其中帧可能被编译为本机代码?

4

4 回答 4

5

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

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

于 2012-07-06T12:47:34.690 回答
3

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

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

对此功能的编译器支持将添加到 C# 的下一个版本,即版本 5,带有[CallerMemberName] 属性

于 2012-07-06T13:07:45.047 回答
1

AFAIK 没有。

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

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

在此处输入图像描述

于 2012-07-06T12:47:18.693 回答
0

感谢您的答复。

我的问题是我遇到了包含列出语句(访问冲突)的代码的零星崩溃,但是如果没有该语句,代码一直是稳定的。但由于这些回复,我似乎必须另辟蹊径。

于 2012-07-09T04:52:00.507 回答