我有以下内容:
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中放置MessageBox()调用并获取消息框。
在远离VC6几年后,我是VS2005的新手。我记得在VC6的日子里,有一种类似的情况,就是符号信息不可用。然而,在这种情况下,两个函数都在同一个文件中,所以符号信息必须是正确的。同样,在这种情况下,我认为你甚至不能设置断点。
我已经尝试了所有愚蠢的巫术,比如重建整个解决方案。
我忽略了什么愚蠢的事情?
编辑:添加了FuncB的代码,以回应关于它可能本质上是可内联的评论。(这只是MSDN中wglUseFontBitmaps的确切示例代码[这里减去注解])。我不认为内联会如何阻碍每个调用。
6条答案
按热度按时间yr9zkbsy1#
确保禁用所有编译器优化(/Od)。编译器优化可能导致调试器断点问题。
5gfr0r5j2#
不确定问题是什么,但您可以尝试查看反汇编代码。您可以使用is在源代码和反汇编视图之间切换。我在工作时没有IDE,因此术语可能会略有偏差。
如果将调试器置于此模式,则可以看到正在执行的程序集指令。这有时有助于确定这类问题。有时,虽然通常不使用调试版本,但编译器会优化调用。
tvmytwxo3#
如果一切都失败,尝试更新到VS 2005 SP1(如果您还没有)...
听起来真奇怪!
5vf7fwbs4#
感谢您发布代码。这显然不是我所猜测的。
为了后代着想,也为了澄清一些事情,我的猜测是,如果(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手册曾经有一个声明,说一些编译器会拒绝在优化的代码中发出调试符号,因为他们的调试器不能遵循它。
ckx4rj1h5#
实际上我有一个类似的问题,发现代码没有得到编译时,我正在运行的程序,所以请确保您“编译”的程序之前,您尝试运行它
abithluo6#
将模式从发布切换到调试