【问题标题】:Visual Studio 2012 Express debugging explorer.exe - no breakpoint hitVisual Studio 2012 Express 调试 explorer.exe - 没有断点命中
【发布时间】:2012-10-12 12:11:06
【问题描述】:

我在调试 SolidWorks Enterprise PDM 插件时遇到问题。我不知道如何在 EPDM 中处理插件,但问题似乎与 Visual Studio 有关 - 也许其他人与其他平台的插件有类似问题。

添加调试插件(以便使用最新源):

在 Visual Studio 2010 Express 中没有问题 - 杀死资源管理器,启动它,附加到它,然后:

我无法使用 Visual Studio 2012 Express 实现同样的效果。虽然它似乎正在调试资源管理器(文件是只读的,显示停止调试按钮),但它没有遇到断点:

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

我确实重新启动了 explorer.exe,所以加载了最新版本的插件。项目使用启动操作“explorer.exe”:

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

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

谢谢!

更新 1

我检查了 Hans 的建议 - 有两个其他进程正在启动,但附加到它们并没有产生任何结果。

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

更新 2

当我将 VisualStudio 附加到托管 explorer.exe - 断点被命中!

explorer.exe 似乎只是有时在托管模式下运行:

它甚至可以同时在两种模式下运行:

那么问题是如何强制 VisualStudio 在托管模式下启动 explorer.exe?

更新 3

这可能是 VisualStudio 2012 的错误吗?

使用 VS2010 调试时,资源管理器以正常模式启动,但加载插件后,它立即切换到托管模式,并且 VS2010 在断点处停止。

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

但是当 VS2012 附加到已经处于托管模式的 explorer.exe 时,它​​会在断点处停止。

更新 4

我已经设法解决了问题的本质 - 当将 VS2012 附加到另一个进程(例如 explorer.exe)时,选择了“自动确定要调试的代码类型”,并且进程以本机模式启动,并且一些稍后加载托管代码 - 调试器不会在断点处停止。当附加到或附加到明确选择的代码类型时进程已经处于托管模式时(“托管(v3.5,v3.0 , v2.0)") - 调试器在断点处停止。

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

更新 5

我刚刚在 a simple managed shell extension 上对其进行了测试,因此它与 SolidWorks Enterprise PDM 无关。

我还在连接上发布了a more precise bug

更新 6

截至 2013 年初,Microsoft 声称 调试器未按预期运行是一个设计决策。第一个连接错误报告中的更多详细信息。

【问题讨论】:

  • 杀死并重新启动 Explorer 以调试特定于供应商的插件模型是非常没有意义的。而是启动供应商的应用程序。请联系该供应商以获得支持。
  • EPDM 安装为 Windows 资源管理器扩展 - 这就是我调试 explorer.exe 的原因(它适用于 VS2010)。我会验证是否有任何其他进程以它开始。

标签: c# debugging visual-studio-2012 breakpoints windows-explorer


【解决方案1】:

当您构建.dll(我假设它以这种方式加载到资源管理器中)时,断点总是存在问题(至少根据我的经验),因为您无法提前知道文件将在内存中加载的位置,因此很难添加断点。

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

asm {
    int 3;
}

在 C# 中there's a method for that:

System.Diagnostics.Debugger.Break()

尝试添加到函数/代码部分的开头(不要忘记在调试模式下共同编译)。

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

【讨论】:

  • 添加 Debugger.Break();没有停止 VisualStudio
  • 非常有用的方法...只是不要忘记在DEBUG模式下编译。
  • @marchewek 你有调试版本吗?您确定您的功能已加载吗?您是否尝试过其他调试器?
  • 我使用调试模式,我写了调试符号被加载(所以函数是),我写在 VS2010 中一切正常。
  • @marchewek 如果您尝试在(比如说)OllyDbg 中启动 explorer,会发生什么?这似乎是视觉工作室方面的一些“心理问题”。
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 2018-01-21
  • 2015-05-23
  • 2013-02-07
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
相关资源
最近更新 更多