如果设置了 IgnoreSymbolStoreSequencePoints 标志,为第三方 dll 生成 .pdb 文件是否有助于在调试期间进行源步进?

问题描述

我的问题的背景:

  • 我有一个第三方库,我想调试它,它有 DebuggableAttribute 的 IgnoreSymbolStoreSequencePoints 标志。可以假设存在编译时代码优化,即 /optimize 并且 DebuggableAttribute 位掩码是发布标准 (01 00 02 00 00 00 00 00)。
  • 通过 ILSpy 或其他一些工具,我可以为它生成 pdb 文件,该文件可能会保存序列点,以便我可以更轻松地逐行调试(显式序列点

但是对于我的问题:这个 pdb 文件在提供流畅的调试体验方面毫无意义,而由于标志和 MSIL 代码的优化而忽略它的序列点大概隐式序列点nops)方面有多少?

解决方法

使用 IgnoreSymbolStoreSequencePoints,调试器仅使用隐式序列点。 那些发生:

  • 有关 nop 的说明
  • 每当 IL 堆栈为空时
  • 直接按照 call 说明

ILSpy 将尝试创建一个 .pdb,其序列点与隐式序列点 (PR 1967) 的位置相同。实际上,生成的 .pdb 将源代码行与隐式序列点相关联。

这允许对反编译代码进行一些有限的步进,因为通常有足够的隐式序列点。但您说得对,调试体验并不总是顺利。