调试器(或 CLR 异常处理程序)是否可以使用 pdb 显示在 Release模式下发生异常的行?

Release模式下的代码经过优化,并不总是遵循“原始”代码的顺序和逻辑。

同样令人惊讶的是,即使在 Release模式下,调试器也可以逐步浏览我的代码。优化应该使导航非常不舒服。

你能帮我澄清这两点吗?

最佳答案

我不太熟悉 CLR 是如何完成的,但它可能与使用 native 代码完成的方式非常相似。当编译器生成机器指令时,它会向 pdb 添加条目,这些条目基本上说“当前地址 X 处的指令来自 foo.cpp 中的第 25 行”。

调试器知道当前正在执行的程序地址。因此,它在 pdb 中查找某个地址 X,并发现它来自 foo.cpp 中的第 25 行。使用它,它可以“单步执行”您的源代码。

无论是在Debug还是Release模式下,此过程都是相同的(前提是在Release模式下完全生成了pdb)。但是,您是对的,由于优化,通常在 Release模式下调试器不会“线性地”遍历代码。它可能会意外跳到不同的行。这是因为优化器改变了指令的顺序,但它并没有改变地址到源线的映射,所以调试器仍然能够遵循它。

关于debugging - 在 Release模式下从pdb获取行号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/935726/

10-10 22:58