c# - 即使 DebugType=full,也无法在 Release模式下调试应用程序

标签 c# visual-studio-2010 clr release visual-studio-debugging

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

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

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

更新

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

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

最佳答案

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

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

  • 附加调试器时,您可以选择调试器类型。一定要选择“Managed”,原生调试器用处不大
  • 确保您正在查看正确的线程,程序可以在任意位置中断。使用Debug + Windows + Threads选择合适的线程
  • 确保您的代码中的某个位置确实存在问题。您很容易在 Windows 操作系统 DLL 或框架方法中结束,在这种情况下几乎没有什么可看的。工具 + 选项、调试、符号并启用符号服务器,以便在 Windows 内部启动的堆栈跟踪是准确的
  • 调试器必须能够找到 PDB 文件。使用 Debug + Windows + Modules,你会看到进程中加载​​的程序集。首先确保您要调试的那个确实已加载。右键单击它并选择“符号加载信息”。它会向您显示它在何处查找 PDB 文件
  • “仅我的代码”选项可能会严重妨碍您,您很可能会遇到大量不属于您的代码块。工具 + 选项、调试、常规,然后关闭该选项。

关于c# - 即使 DebugType=full,也无法在 Release模式下调试应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17675226/

相关文章:

c# - 减少成员类中列表属性的数量

visual-studio - Visual Studio 2010关闭选项卡需要8秒钟?

visual-studio-2010 - 如何从 Visual Studio 创建 SQL Server 数据库?

.net - .NET 中的数组是否自然对齐?

c# - .Net core 2.0 控制台应用程序的日志记录和配置?

c# - 如果命令绑定(bind)解析为空,为什么启用按钮?

c# - ASP.NET Core Controller 中奇怪的死锁情况

c# - 字段初始值设定项不能引用非静态字段、方法或属性

c++ - 带有托管 C++ dll 的加载程序锁(regsvr32 R6033 错误)

.net - 需要单例 COM 对象