为什么断点会在.h文件中跳转?

时间:2012-08-13 14:37:35

标签: c++ visual-studio-2008 breakpoints

我正在尝试使用getter / setter调试.h文件,但是当我附加到我要调试的进程时,当我在某些方法上放置断点时,IDE会自动将断点跳转到文件中的单独方法。有谁知道为什么会发生这种情况?

我尝试过的一些事情:

  • 重建并链接.exe我正在调试
  • 删除.obj文件,并重新创建包含我要调试的文件的目录
  • 与任务管理器核实以确保正在运行的.exe
  • 检查.pdb和.exe文件的时间戳以确保它们(大致)匹配

这不是解决方案范围内的问题;我偶尔也会看到这个。还有什么我可以尝试的吗?

1 个答案:

答案 0 :(得分:3)

考虑一个Point类和一个Rectangle类。想象一下,Point有一个名为GetX()的getter,而Rectangle有一个名为GetLeft()的getter。在机器指令级别,这两个方法可能完全相同,因为它们都返回对象中的第一个32位值。

由于代码相同,编译器和/或链接器可以通过丢弃方法的一个副本并将对丢弃的一个的所有调用解析为对保留的一个来减小二进制文件的大小。例如,链接器可能会从可执行文件中删除Rectangle :: GetLeft(),并使用对Point :: GetX()的调用替换对Rect :: GetLeft()的所有调用。

发生这种情况时,调试器无法再区分GetX()和GetLeft()。即使调用是Rect :: GetLeft(),指令指针也在属于Point :: GetX()的代码范围内。您可以通过查找堆栈来查看实际调用的方法来区分,但调试器不会为您执行此操作。

通常,您会在禁用优化的情况下构建调试版本,以避免调试此类混淆。这并不总是可行的。例如,您可能正在调试运行优化二进制文件的客户的故障转储。在这种情况下,您只需要知道这个问题,并了解调用上下文以了解实际情况。