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

11
我们正在开发一个发布解决方案,但是在使用2010专业版的Studio尝试连接时,没有任何线程显示任何堆栈信息,也无法设置任何断点等。
目标是能够将Visual Studio / JIT调试器附加到正在运行的进程上,同时尽可能多地获得优化效益。
我们大部分搜索的结果是“使用debug:full编译”,然后就可以进行调试了,但事实并非如此,我想JIT会在运行时优化代码,因此我们无法调试,这是真的吗? 是否有可能编译并告诉JIT减少优化并允许调试? (同时保留其他优化)
更新 使用@HansPassant的答案,我查看了模块,并发现虽然pdbs与二进制文件在同一目录中,但确实没有加载任何调试符号。 我还看到我的库标记为“用户代码” - “否”,这可能是它未自动加载的原因。 通过手动加载符号并禁用“仅限我的代码”,我还能够设置断点并查看堆栈。
现在的问题是:为什么我的代码没有标记为用户代码?这是正常行为吗?我能否以某种方式配置我的程序集以避免这种情况?

为什么不能设置断点?是因为出现了“找不到匹配符号”的错误消息吗?但是,这并不意味着无法调试代码。 - wal
@wal 请查看更新后的问题,它是由于缺少符号和“仅我的代码”被禁用的组合造成的。 - Amit Bens
2个回答

18

在调试优化代码时并不是一件愉快的事情。你可能会遇到麻烦,例如:断点无法设置,方法可能已经被内联。而检查本地变量和方法参数时,由于变量被优化为存储在CPU寄存器中,导致调试器不稳定。

然而,你仍然可以检查调用栈,可以在堆栈跟踪中看到未被内联的方法。以下是你可能会犯的一些基本错误:

  • 当你附加调试器时,你会得到选择调试器类型的选项。请确保选择“托管代码”,原生调试器对你而言没有多大用处。
  • 确保你正在查看正确的线程,程序可能会在任意位置中断。使用“调试”+“窗口”+“线程”选择适当的线程。
  • 确保你实际上是在代码的某个位置中断。你很容易会进入Windows操作系统或框架方法中,这种情况下很少有东西可供查看。工具+选项、调试、符号并启用符号服务器,以使从Windows开始的堆栈跟踪准确无误。
  • 调试器必须能够找到PDB文件。使用“调试”+“窗口”+“模块”,你将看到加载在该进程中的程序集。首先确保要调试的程序集已经加载。右键单击它并选择“符号加载信息”,它会显示PDB文件的位置。
  • “仅显示我的代码”选项可能会给你带来很大的麻烦,因为你很可能会遇到大量不属于你的代码块。工具+选项、调试、常规,关闭该选项。

2
“模块”窗口显示我的程序集未被视为用户代码,请查看更新的问题。 - Amit Bens

2

我想跟进一下你的问题并提供额外的答案,以帮助其他人。

来自微软

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接