Visual Studio 2012 Express调试explorer.exe - 没有发生断点

问题描述:

我在调试SolidWorks Enterprise PDM插件时遇到了问题。我不知道EPDM中的插件是如何处理的,但这个问题似乎与Visual Studio有关 - 也许其他人与其他平台的插件有类似的问题。Visual Studio 2012 Express调试explorer.exe - 没有发生断点

添加调试插件(以便使用最新的源代码): PDM debug addin

在Visual Studio 2010速成有没有问题 - 杀探险家,启动它,重视它和: VS2010 debugging successful

我无法通过Visual Studio 2012 Express实现。虽然它看起来是它的调试资源管理器(文件是只读的,停止调试按钮显示),它没有命中断点: VS2012 debugging failure

我在Windows 7 Professional x64上工作。插件是使用.NET 3.5构建的。我已经使用VS2010和VS2012解决方案都有同样的问题。

我重新启动explorer.exe,因此加载了最新版本的插件。项目使用启动动作“explorer.exe”:

<StartAction>Program</StartAction> 
    <StartProgram>$(windir)\explorer.exe</StartProgram> 
    <StartArguments></StartArguments> 

我不知道为什么断点没有命中,任何帮助非常感谢。

谢谢!

更新1

我查了一下汉斯建议 - 还有其他启动两个进程,而是连接到它们没有造成任何东西。

这指出了一件事 - 当我附加到这些进程时,VisualStudio中有一个信息,断点不会被击中,因为没有调试符号被加载 - 注意在the third image attached调试符号被加载(红色圆圈填满,没有感叹号)。

更新2

当我的VisualStudio连接到管理的explorer.exe - 断点被击中!

看来,Explorer.exe的是在托管模式下运行只是有时:

它甚至可以在两种模式下并排运行: explorer.exe in two modes

所以现在的问题是如何给力的VisualStudio在托管模式下启动explorer.exe?

更新3

它是一个可能的VisualStudio 2012错误?

使用VS2010进行调试时,浏览器以正常模式启动,但一旦加载插件被加载,它将切换到托管模式,并且VS2010停止在断点处。

与VS2012不同 - 当加载插件被加载时,explorer.exe不会被切换到托管模式,因此?(它被连接?)断点不会被命中。

但是,当VS2012连接到已处于托管模式的explorer.exe时,它会停在断点处。

UPDATE 4

我已经成功地到达问题的本质 - 与附着VS2012当向其他处理(例如explorer.exe的)“自动确定的代码的类型调试”选择”和该进程以本机模式启动,并在一段时间后加载托管代码 - 调试程序不会停止在断点处当进程在附加或附加明确选择的代码类型时已处于受管模式(“ Managed(v3.5,v3.0,v2.0)“) - 调试器停在断点处。

已发布在connect - 正在等待解决方案。如果您遇到与此更新中所述相同的问题,请投票。

UPDATE 5

我刚刚测试了a simple managed shell extension,所以它不是的SolidWorks Enterprise PDM的 - 有关。我也发布了a more precise bug连接。

UPDATE 6

截至2013年年初微软声称,它是预期调试器不表现一个设计决策的。第一个连接错误报告中的更多细节。

+0

它使杀死并重新启动资源管理器来调试供应商特定的插件模型非常有意义。改为启动供应商的应用程序。联系该供应商寻求支持。 –

+0

EPDM安装为Windows资源管理器扩展 - 这就是为什么我正在调试explorer.exe(它适用于VS2010)。我将验证是否有其他任何以它开始的进程。 – marchewek

当你构建一个.dll(我假设这样它被加载到资源管理器中)断点总是有问题(至少在我的经验中),因为你无法事先知道文件将被加载到内存中,因此很难添加断点。

您可能会尝试在代码中添加手动breakpoint invocation(即int3)。在C++中,这将是:

asm { 
    int 3; 
} 

在C#there's a method for that

System.Diagnostics.Debugger.Break() 

尝试添加到你的函数/代码部分的开头(别忘了调试模式共同编译)。

然后,您将开始调试加载.dll文件的应用程序(.exe),并且加载的库应该触发一个中断点。

+0

添加Debugger.Break();没有停止VisualStudio – marchewek

+0

非常有用的方法...只是不要忘记在DEBUG模式下编译。 –

+0

@marchewek你有调试版吗?你确定你的函数被加载了吗?你有没有尝试过另一个调试器? – Vyktor