考虑一个 Point 类和一个 Rectangle 类。想象一下,Point 有一个名为 GetX() 的 getter,而 Rectangle 有一个名为 GetLeft() 的 getter。在机器指令级别,这两种方法可能相同,因为它们都返回对象中的第一个 32 位值。
由于代码是相同的,编译器和/或链接器可以通过丢弃方法的一份副本并将所有对丢弃的方法的调用解析为对保留的方法的调用来减小二进制文件的大小。例如,链接器可能会从可执行文件中删除 Rectangle::GetLeft(),并将所有对 Rect::GetLeft() 的调用替换为对 Point::GetX() 的调用。
发生这种情况时,调试器将无法再区分 GetX() 和 GetLeft()。即使调用的是 Rect::GetLeft(),指令指针也在属于 Point::GetX() 的代码范围内。您可以通过查找堆栈以查看实际调用了哪个方法来区分差异,但调试器不会为您执行此操作。
通常,您构建调试版本时禁用优化以避免此类调试混淆。这并不总是可能的。例如,您可能正在调试运行优化二进制文件的客户的故障转储。在这种情况下,您只需了解问题并了解调用上下文即可了解实际情况。