8

我按照这些说明将 IL 偏移添加到 Silverlight 堆栈跟踪。这在 DEBUG 模式下构建时效果很好,但是我们的生产/qa 构建过程使用 RELEASE 模式编译所有内容,这似乎丢失了 IL 偏移信息。在发布模式下,所有 IL 偏移量最终都为“0xffffffff”。使用反射器比较调试/发布程序集我注意到DebuggableAttribute的使用方式不同。

调试构建:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: ComVisible(false)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]
[assembly: AssemblyConfiguration("Debug")]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows=true)]
[assembly: Extension]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: CompilationRelaxations(8)]
[assembly: TargetFramework("Silverlight,Version=v5.0", FrameworkDisplayName="Silverlight 4")]
[assembly: AssemblyCopyright("Copyright @ Foo Company 2010-2012")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyTitle("Foo.Ria.Bar")]
[assembly: AssemblyCompany("Foo Company")]
[assembly: AssemblyProduct("Foo Product")]

与发布构建:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: ComVisible(false)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows=true)]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyTitle("Foo.Ria.Bar")]
[assembly: AssemblyTrademark("")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: CompilationRelaxations(8)]
[assembly: TargetFramework("Silverlight,Version=v5.0", FrameworkDisplayName="Silverlight 4")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyCompany("Foo Company")]
[assembly: AssemblyProduct("Foo Product")

MSDN 说

DebuggableAttribute类控制运行时如何处理模块中的代码运行时可能会跟踪有关生成的代码的额外信息,并且可能会根据此属性中包含的值禁用某些优化。

有没有人有调整DebuggableAttribute设置的经验?是否有任何不涉及完全禁用优化的解决方法(DebuggingModes.DisableOptimizations)?

4

1 回答 1

0

DebuggableAttribute编译器添加以控制 JIT 代码生成。事实上,当代码应该是可调试的并且某些优化没有发生时,它会以不同的方式生成。

如果您需要调整生成的程序集,您需要转储 IL,更改属性并通过以下方式重新编译它:ildasm创建一个人类可读的 IL 源代码,可以通过传统文本编辑器进行更改,而ilasm用于重新编译它.

这个过程可以在您的构建中自动化。请记住,您正在弄乱编译器生成的某些内容,并且不应该被触及。

重要提示:如果使用强名称和/ir 验证码,则需要再次对程序集进行签名。

于 2019-12-05T11:31:30.230 回答