Visual Studio 跳过代码行
Posted
技术标签:
【中文标题】Visual Studio 跳过代码行【英文标题】:Visual Studio skips lines of code 【发布时间】:2016-01-15 08:17:48 【问题描述】:我一直在开发一个程序,在该程序中我使用 EnumWindows 函数来检测活动的 Windows 并将它们的句柄保存在一个列表中。 现在,每次我运行到目前为止的所有内容时,调试器都会跳过 EnumWindows 函数所在的行,而不会返回错误。
我的代码有问题吗?还是我必须获得一个额外的库才能访问此功能?希望有人知道如何解决这个问题 这是包含 EnumWindows 的类的代码:
Center :: Center(int initInterval) : interval(initInterval)
detectWindows();
int Center :: getInterval()
return interval;
void Center :: setInterval(int intrvl)
interval = intrvl;
void Center :: initializeDisplays()
void Center :: detectWindows()
EnumWindows(detectWindowsProc, (LPARAM)&windowList); //Debugger skips this line
【问题讨论】:
你能告诉我们更多关于你所说的“跳过这条线”的信息吗?你是单步执行程序吗?您是否正在步入detectWindows
方法?
msvcp120d.i386.pbd 仅用于步进到您不需要的VS特定代码。 EnumWindows 也 - 你不需要 pdb 文件。在这里,您只需要可执行文件的 pdb 文件。如果它不同步,那么要么你有线程问题,要么 pdbs 不匹配。我不知道您使用的是哪个版本的 VS,但您可以看到已加载的 PDB 及其路径 - 请检查您的可执行文件 VS 2013。尝试以下调试->Winddows->Modules(请参阅下面的编辑)
【参考方案1】:
不应只是跳过代码,这通常表明您的源/exe/ 和 PDB 文件不同步。清理您的项目并重试(删除所有 .exe、obj、pdb)并确保您正在进行调试构建。
检查调试->Windows->模块。我刚刚测试了一个类似的场景,在断点上运行良好。检查您的 PDB 的时间戳,如此处所示,以确保它是最新的
【讨论】:
我们说的是同一件事 :) “并确保您正在进行调试构建。”【参考方案2】:“跳线”是什么意思?调试器将越过它,执行它,但由于您没有可用于 Windows 功能的调试信息,因此无法介入它。通常,如果您在detectWindowsProc
中放置一个断点,则应该触发该断点。如果有要枚举的窗口,EnumWindows
有一些奇怪的怪癖,请参阅那里的 MSDN 和 cmets 了解更多信息:
EnumWindows function
【讨论】:
感谢您的回复,看起来它跳过了它,但我只是尝试将断点设置到 detectWindowsProc 函数而不是 EnumWindows 函数的前面。它表明它现在实际上进入了 detectWindowsProc 函数,然后突然跳到一个屏幕上说:“未加载 msvcp120d.i386.pbd - 未加载符号”。有没有办法解决这个问题?这是否意味着它实际上正确执行了 EnumWindows 函数并且找不到任何窗口?我使用 PyWin 在 Python 中使用了类似的代码,它运行良好.. 如果您没有 pdb 文件,您将无法调试该部件(也许您可以获得它们?)。请参考this。EnumWindows
函数会跳转到您没有且您没有调试信息的代码。然后该逻辑调用您的回调detectWindowsProc
并在完成后继续其自己的逻辑以最终跳回您的“detectWindows. If
detectWindowsProc”,它似乎一切正常,您只是没有调试信息中间。【参考方案3】:
我也遇到过这个问题。对我来说 .pdb 文件与 .dll 不同步 我更新了 dll 和 pdb,问题得到了修复。
【讨论】:
亚当的回答已经包含了这个建议,包括如何检查它们是否是最新的以及如何更新这些文件。此外,2016 年接受了一个答案;没有任何理由在这里添加另一个答案。以上是关于Visual Studio 跳过代码行的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 2012 中调试 C++ 代码时跳过 STL 代码?
在Visual Studio 2012中使用MSBuild PublishProfile时,MSDeploy跳过规则