调试器(或CLR异常处理程序)是否可以使用pdb显示发布模式中发生异常的行?
在发布模式下,代码已经过优化,并不总是遵循“原始”代码的顺序和逻辑。
令人惊讶的是,调试器可以逐步浏览我的代码,即使在发布模式下也是如此。优化应该使导航非常不舒服。
请你澄清这两点吗?
答案 0 :(得分:10)
我不熟悉如何使用CLR,但它可能与使用本机代码完成的方式非常相似。当编译器生成机器指令时,它会向pdb添加条目,基本上说“当前地址的指令X来自foo.cpp中的第25行”。
调试器知道当前正在执行的程序地址。所以它在pdb中查找一些地址X,并看到它来自foo.cpp中的第25行。使用它,它可以“逐步”完成源代码。
无论调试模式还是发布模式,此过程都是相同的(前提是在发布模式下完全生成pdb)。但是,你是正确的,由于优化调试器通常在发布模式下不会“线性”地通过代码。它可能会意外跳到不同的行。这是由于优化器更改了指令的顺序,但它不会更改地址到源代码行的映射,因此调试器仍然可以遵循它。
答案 1 :(得分:1)
[@ Not Sure]几乎是正确的。 编译器尽最大努力确定与当前机器代码指令非常匹配的适当行号。
PDB和调试器对优化一无所知; PDB文件实质上将机器代码中的地址位置映射到源代码行号。在优化的代码中,并不总是能够将汇编指令与特定的源代码行完全匹配,因此编译器将向PDB写入最接近的函数。这可能是“之前的源代码行”,或“封闭上下文的源代码行(循环等)”或其他内容。
无论如何,调试器基本上在PDB映射中找到与当前IP(指令指针)最接近的条目(如“之前或之前”)并突出显示该行。
有时匹配不是很好,当你看到突出显示的区域跳到那个地方时。
答案 2 :(得分:0)
调试器尽力猜测问题发生的位置。它不能保证100%准确,并且通过完全优化的代码,它通常是不准确的 - 我发现不准确的范围从几行到完全错误的调用堆栈。
调试器对优化代码的准确程度实际上取决于代码本身以及您正在进行哪些优化。
答案 3 :(得分:0)