dnSpy - 让调试镜像文件的工作变得轻松点

原文在这里:https://github.com/0xd4d/dnSpy/wiki/Making-an-Image-Easier-to-Debug

参考了这里:https://docs.microsoft.com/zh-cn/archive/blogs/sburke/how-to-disable-optimizations-when-debugging-reference-source

当你把调试器附加到任意的.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 Studio\2017\Enterprise\Common7\IDE"
start devenv.exe
exit

当然你也可以选择设置系统环境变量,只不过这样影响面更大,如何选择视你的需要而定。

对于老版本的Visual Studio来说,你还需要关掉项目调试选项中的承载进程选项。这下你可以看到所有的局部变量信息了。

前:

前

后:

后

顺便说下关掉承载进程有什么影响(虽然绝大多数情况下都没有什么影响):

1、不能在区域中调试(Debug In Zone),无法调试在类似“Internet”或者”Intranet”这样安全区域中的进程了。

2、类库的设计时表达式求值功能也无法使用,这意味着不能在调试器中的立即窗口里面执行代码了。

posted on 2020-04-05 11:27  sPhinX  阅读(876)  评论(0编辑  收藏  举报

导航