2012-03-08 45 views
12

假设我有一个抛出异常的函数。假设这个函数被第三方DLL调用,并且第三方DLL将处理我抛出的异常。Visual Studio认为“用户代码”是什么?

如果Visual Studio确定第三方DLL不是“用户代码”(如下图所示),那么默认情况下它将停止在我的异常处,即使稍后处理它。这不是错误这样做;它清楚地解释了该异常是由用户代码未处理的。但是,什么让Visual Studio调用一些DLL“用户代码”而其他的不是?

enter image description here

我有一个理论,这是因为这些符号不会被加载,但在已加载的符号,但仍不能认为是“用户代码”列表模块。

+0

对于其他人在调试菜单上找到模块窗口,选择Windows,然后单击模块。一个有用的显示,用于跟踪正在使用的.dll(我的代码不会调试,因为它使用的是GAC中的lib副本,而不是来自引用项目的输出),谢谢指出。 – RyanfaeScotland 2015-04-09 13:29:07

回答

12

是的,没有.pdb文件,调试器无法判断它是否是用户代码。它在MSDN article解释还算不错:

要区分非用户代码用户代码,仅我的代码着眼于三个方面:DBG文件,PDB文件和优化。

在标准的Debug版本中,关闭优化并为所有模块创建调试符号。当您运行调试版本时,这些模块被认为是用户代码。如果我调用经过优化的库函数,但没有调试符号,则不是用户代码。只是我的代码可以防止执行停止在库代码中的断点处,这通常不是您想要调试的代码。在“断点”窗口中,这些断点将显示“禁用断点”图标。

+0

这是完美的。考虑到这一点,我发布了一个[阻止调试器停止库中的所有异常]的答案(http://stackoverflow.com/a/9616890/33080),并添加了另一个解决方法,用于NUnit的'Assert.Throws 'halting](http://stackoverflow.com/a/9609494/33080)。太好了! – 2012-03-08 14:40:06

+0

这仍然是模糊的。我认为可以安全地说“用户代码=没有优化+调试符号”? – 2014-12-26 02:28:45

相关问题