11

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

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

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

更新

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

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

4

2 回答 2

18

调试优化的代码并不是一件好事。您当然可能无法设置断点,一个方法可能已被内联。当变量被优化为存储在 cpu 寄存器中时,检查局部变量和方法参数很容易使调试器感到闷闷不乐。

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

  • 附加调试器时,您可以选择调试器类型。一定要选择“托管”,你不会对原生调试器有太多用处
  • 确保您正在查看正确的线程,程序可以在任意位置中断。使用 Debug + Windows + Threads 选择合适的线程
  • 确保您实际上在代码中的某个位置被破坏。您可以轻松地在 Windows 操作系统 DLL 或框架方法中结束,在这种情况下几乎没有什么可看的。工具 + 选项、调试、符号并启用符号服务器,以便在 Windows 内部启动的堆栈跟踪将是准确的
  • 调试器必须能够找到 PDB 文件。使用 Debug + Windows + Modules,您将看到在该过程中加载的程序集。首先确保实际加载了您要调试的那个。右键单击它并选择“符号加载信息”。它显示了它在哪里寻找 PDB 文件
  • “只是我的代码”选项可能会严重妨碍您,您很可能会遇到大量不属于您的代码。工具+选项,调试,常规,然后关闭该选项。
于 2013-07-16T12:59:43.640 回答
2

以为我会跟进有关您更新的问题的其他答案以帮助他人。

来自微软

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

于 2018-04-05T12:38:27.583 回答