5

我正在尝试调试发布 Web 服务的 Azure 应用程序,而 Visual Studio 2012 拒绝显示源代码,即使已加载 PDB。这是我的设置:

在调试 > 选项和设置... > 调试 > 常规:

  • []启用仅我的代码
  • [] 启用 .NET Framework 源单步执行
  • [x] 启用源服务器支持
  • [ ] 要求源文件与原始版本完全匹配

在 DEBUG > Options and Settings... > Debugging > Symbols 上:

解决方案属性 > 调试源文件:

  • c:\path\to\my\CSfiles\
  • c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src\
  • ETC

重现步骤:

  1. 将 Azure 应用程序部署到 Development Fabric(计算模拟器)。
  2. 以管理员身份打开 VS2012。
  3. 附加到 WaWorkerHost.exe,等待符号加载并验证 MyModule.dll 是否已加载符号。
  4. [可选] 选择解决方案属性... > 调试源文件并添加 c:\path\to\my\CSfiles\ 作为第一个条目。
  5. 选择 DEBUG > New Breakpoint > Break At Function...
  6. 功能:MyClass.MyMethod。语言:C#。
  7. VS2012 抱怨找不到,但它添加了断点。
  8. 使断点命中。
  9. 一旦点击,双击“调用堆栈”的第一项。它是 MyClass.MyMethod,由 System.ServiceModel.dll 中的一个类调用。
  10. VS2012 显示只有“显示反汇编”选项的“无可用源”(下图):

在此处输入图像描述

在调用堆栈窗口中,如果我右键单击当前方法(被断点击中),然后选择符号加载信息...,最后一行显示:

c:\path\to\my\PDBs\MyModule.pdb: Symbols loaded.

如果我打开 DEBUG > Windows > Modules,我的模块会正确显示:

  • 路径正确。
  • 优化 = 否。
  • 用户代码 = N/A(与其他所有内容一样)。
  • 符号状态 = 已加载符号。
  • 符号文件 = c:\path\to\my\PDBs\MyModule.pdb (这是正确的)。

是的,该应用程序是使用完整的调试信息构建的。我已经使用这个工具转储了 PDB ,它在正确的位置显示了我的源代码。

有趣的是,我可以看到 .NET Framework 的所有源代码。我只是看不到自己的来源,这真的很令人沮丧。

我已经从用户目录\Documents\Visual Studio 2012\Projects 中删除了任何 .suo 文件,但没有帮助。我想这无济于事,因为我总是附加到一个可执行文件,它会自动创建一个新的全新解决方案。

4

1 回答 1

0

我以为微软发布了.net 的所有代码。但显然 ServiceModel 程序集仍然关闭。

可能是 ServiceModel 在调用您的代码之前做了一些魔术,使调试器感到困惑。

但是对于您的问题,听起来该服务正在运行您的 dll 的旧版本。

尝试取消选中“要求源文件与原始文件完全匹配”设置,看看它是否在断点处中断。如果它在那个阶段达到你的断点,那么这意味着在部署你的 dll 时存在一些问题。

您是否尝试过任何像 resharper 这样的反编译器来查看它是否有效?

于 2013-10-30T07:13:05.360 回答