原文在这里:https://github.com/0xd4d/dnSpy/wiki/Making-an-Image-Easier-to-Debug
当你把调试器附加到任意的.NET进程时,这个进程很有可能是被优化过的。这会使得调试过程中的体验变的很差,因为调试器无法读取所有的局部变量,对表达式求值或调用方法。所以你应该尽可能让dnSpy来启动进程。
如果你不得不附加进程的话,微软推荐你新建一个ini文件。
如果你的文件叫myapp.exe或者something.dll,那你相应的需要新建一个叫myapp.ini或者something.ini的文件,并把这个文件放到与exe或者dll文件所在的同一个文件夹下,文件内容如下:
[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0
注意:不能用UTF8 BOM编码方式保存这个文件!
必须给每一个exe或者dll文件配备一个相应的ini文件,光是给主exe文件配ini文件是不够。
另外,为了关闭.NET的优化选项,需要告诉CLR不要加载per-JIT(也就是通常所谓的NGEN)镜像文件,你可以新建一个CMD文件,名字可以叫NoOptDevEnv.cmd,内容大致如下:
set COMPLUS_ZapDisable=1
cd /d "%ProgramFiles(x86)%Microsoft Visual Studio2017EnterpriseCommon7IDE"
start devenv.exe
exit
当然你也可以选择设置系统环境变量,只不过这样影响面更大,如何选择视你的需要而定。
对于老版本的Visual Studio来说,你还需要关掉项目调试选项中的承载进程选项。这下你可以看到所有的局部变量信息了。
前:
后:
顺便说下关掉承载进程有什么影响(虽然绝大多数情况下都没有什么影响):
1、不能在区域中调试(Debug In Zone),无法调试在类似“Internet”或者”Intranet”这样安全区域中的进程了。
2、类库的设计时表达式求值功能也无法使用,这意味着不能在调试器中的立即窗口里面执行代码了。