问题描述
我的问题的背景:
- 我有一个第三方库,我想调试它,它有 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 将源代码行与隐式序列点相关联。
这允许对反编译代码进行一些有限的步进,因为通常有足够的隐式序列点。但您说得对,调试体验并不总是顺利。