4

我有以下内容:

classA::FuncA()
{
 ... code
   FuncB();
 ... code
}

classA::FuncB(const char *pText)
{
    SelectObject(m_hDC, GetStockObject (  SYSTEM_FONT)); 
    wglUseFontBitmaps(m_hDC, 0, 255, 1000); 
    glListBase(1000); 
    glCallLists(static_cast<GLsizei>(strlen(pText)), GL_UNSIGNED_BYTE, pText); 
}

我可以在 FuncA 的任何地方打断点。如果我尝试进入 FuncB,它就会跳过。它将接受 FuncB 中的断点,但从不命中它。我知道它正在执行 FuncB,因为我可以在 FuncB 中调用 MessagBox() 并获取消息框。

在远离大量 VC6 使用几年之后,我是 VS2005 的新手。我在 VC6 的日子里回忆起的一种情况是,如果符号信息不可用。但是,在这种情况下,两个函数都在同一个文件中,因此符号信息必须正确。同样在那种情况下,我认为您甚至无法设置断点。

我已经尝试了所有愚蠢的巫术,比如重建整个解决方案。

我忽略了什么愚蠢的事情?

编辑:添加了 FuncB 的代码,以回应关于它可能基本上可以内联的评论。(这只是来自 MSDN 的 wglUseFontBitmaps [减去此处的注释] 的确切示例代码)。我看不出内联会如何阻碍每次调用。

4

5 回答 5

6

确保禁用所有编译器优化 (/Od)。编译器优化可能会导致调试器断点出现问题。

于 2008-11-19T18:07:05.307 回答
4

不确定问题是什么,但您可能会尝试的一件事是查看反汇编代码。您可以使用 VS 在源代码和禁用视图之间切换。我在工作中没有 IDE,所以这些条款可能略有不同。

如果将调试器置于此模式,您可以看到正在执行的汇编指令。这有时有助于确定这类问题。有时,尽管通常不使用调试版本,但编译器会优化调用。

于 2008-11-19T18:08:04.430 回答
0

如果一切都失败,请尝试更新到 VS2005 SP1(如果您还没有)...

听起来确实很奇怪!

于 2008-11-19T18:03:20.617 回答
0

感谢您发布代码。这显然不是我的猜测。


为了后代,为了澄清事情,我的猜测是,如果(1)函数是一行,(2)编译器内联函数,那么(3)调试器可能不知道如何进入它。这种猜测依赖于这样一个事实,即某些调试器在内联代码和其他编译器优化方面确实存在问题。我对 Visual Studio 的调试器不够熟悉,无法说出它是否在该列表中。

在大多数使用 stabs 格式的系统上,-g 允许使用只有 GDB 可以使用的额外调试信息;这些额外的信息使 GDB 中的调试工作更好,但可能会使其他调试器崩溃或拒绝读取程序。...

GCC 允许您将 -g 与 -O 一起使用。优化代码所采取的捷径有时可能会产生令人惊讶的结果:您声明的某些变量可能根本不存在;控制流可能会短暂地移动到您没有预料到的地方;某些语句可能无法执行,因为它们计算常量结果或它们的值已经在手边;有些语句可能在不同的地方执行,因为它们被移出循环。

GCC 手册曾经有一个声明,即某些编译器会拒绝在优化代码中发出调试符号,因为它们的调试器无法遵循它。

于 2008-11-19T19:33:59.310 回答
0

实际上我有一个类似的问题,发现当我运行程序时代码没有被编译,所以在你尝试运行它之前确保你“编译”了程序

于 2009-03-16T11:18:30.847 回答