我有以下内容:
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的确切示例代码[减去这里的评论])。我不知道内联是如何妨碍逐步完成每次通话的。
答案 0 :(得分:6)
确保禁用所有编译器优化(/ Od)。编译器优化可能会导致调试器断点出现问题。
答案 1 :(得分:4)
不确定问题是什么,但您可能尝试的一件事是查看反汇编代码。你可以用VS切换源代码和disassbled视图。我的工作中没有IDE,所以这些条款可能略有不同。
如果将调试器置于此模式,则可以查看正在执行的汇编指令。这有助于确定这些问题。有时,尽管通常不使用调试版本,但编译器会优化调用。
答案 2 :(得分:0)
如果一切都失败,请尝试更新到VS2005 SP1,如果您还没有...
确实很奇怪!
答案 3 :(得分:0)
感谢发布代码。这显然不是我猜到的。
为了后人,为了清理,我的猜测是,如果(1)函数是一行,(2)编译器内联函数,那么(3)调试器可能不知道如何进入它。这个猜测依赖于some debuggers do have trouble with inlined code and other compiler optimizations的事实。我对Visual Studio的调试器不太熟悉,不知道它是否在该列表中。
在大多数使用stabs格式的系统上,-g允许使用只有GDB才能使用的额外调试信息;这些额外的信息使得调试在GDB中工作得更好,但可能会使其他调试器崩溃或拒绝读取程序。 ...
GCC允许您将-g与-O一起使用。优化代码所采用的快捷方式有时会产生令人惊讶的结果:您声明的某些变量可能根本不存在;控制流可能会短暂地移动到你没想到的地方;某些陈述可能无法执行,因为它们会计算出不变的结果,或者它们的值已经存在;某些语句可能会在不同的地方执行,因为它们已被移出循环。
GCC手册过去曾声明某些编译器会拒绝在优化代码中发出调试符号,因为他们的调试器无法遵循它。
答案 4 :(得分:0)
实际上我遇到了类似的问题,发现代码在我运行程序时没有编译,因此请确保在尝试运行之前“编译”程序