即使DebugType = full,也无法在发布模式下调试应用程序

我们正在为Release构建解决方案,但是当尝试使用studio 2010 professional进行附加时,没有线程显示任何堆栈信息,也不能设置任何断点等。

目标是能够将Visual Studio / JIT调试器附加到正在运行的进程,同时具有尽可能多的优化优势。

我们的大多数搜索都归结为“使用debug编译:完全”并且您将能够进行调试,但似乎并非如此,我认为JIT在运行时优化代码,因此我们无法调试,是这是真的? 是否有可能编译并告诉JIT淡化优化并允许调试? (同时保留其他优化)

UPDATE

使用@HansPassant的答案,我查看了模块并看到虽然pdbs与二进制文件位于同一目录中,但实际上没有加载调试符号。 我也看到我的库标记为’用户代码’ – ‘否’,这可能是它没有自动加载的原因。 通过手动加载符号并禁用“just-my-code”,我还能够设置断点并查看堆栈。

现在问题:为什么我的代码没有标记为用户代码? 这是正常的行为吗? 我可以通过某种方式将其配置到我的程序集以避免这种情况吗?

调试优化代码并不是一件很愉快的事情。 您当然可能无法设置断点,可能已经内联了一种方法。 当变量被优化为存储在cpu寄存器中时,检查局部变量和方法参数可能会使调试器变得阴沉。

但是你肯定仍然可以检查调用堆栈,你会看到堆栈跟踪中没有内联的方法。 你可能犯的基本错误:

  • 附加调试器时,可以选择调试器类型。 一定要选择“Managed”,对本机调试器没有多大用处
  • 确保您正在查看正确的线程,程序可以在任意位置被破坏。 使用Debug + Windows + Threads选择适当的线程
  • 确保您的代码中的某个位置确实存在损坏。 您可以轻松地在Windows操作系统DLL或框架方法中结束,在这种情况下,将很少看到。 工具+选项,调试,符号和启用符号服务器,以便在Windows内部启动的堆栈跟踪准确
  • 调试器必须能够找到PDB文件。 使用Debug + Windows + Modules,您将看到流程中加载的程序集。 首先确保实际加载了要调试的那个。 右键单击它并选择“符号加载信息”。 它显示了它查找PDB文件的位置
  • “只是我的代码”选项可能会严重影响您,您很可能遇到大量不属于您的代码。 工具+选项,调试,常规并关闭该选项。

我想我会跟进一个关于你更新的问题的补充答案,以帮助他人。

来自微软 :

为区分用​​户代码和非用户代码,Just My Code查看符号(.pdb)文件和程序优化。 当优化二进制文件或.pdb文件不可用时,调试器将代码视为非用户代码。