Visual Studio 为什么Visual C++不命中中的断点或不单步执行特定函数?

f3temu5u  于 2023-03-03  发布在  其他
关注(0)|答案(6)|浏览(156)

我有以下内容:

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的确切示例代码[这里减去注解])。我不认为内联会如何阻碍每个调用。

yr9zkbsy

yr9zkbsy1#

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

5gfr0r5j

5gfr0r5j2#

不确定问题是什么,但您可以尝试查看反汇编代码。您可以使用is在源代码和反汇编视图之间切换。我在工作时没有IDE,因此术语可能会略有偏差。
如果将调试器置于此模式,则可以看到正在执行的程序集指令。这有时有助于确定这类问题。有时,虽然通常不使用调试版本,但编译器会优化调用。

tvmytwxo

tvmytwxo3#

如果一切都失败,尝试更新到VS 2005 SP1(如果您还没有)...
听起来真奇怪!

5vf7fwbs

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手册曾经有一个声明,说一些编译器会拒绝在优化的代码中发出调试符号,因为他们的调试器不能遵循它。

ckx4rj1h

ckx4rj1h5#

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

abithluo

abithluo6#

将模式从发布切换到调试

相关问题