Visual studio 2015: 不会命中断点,没有为此文档加载任何符号

Visual studio 2015: breakpoint will not be hit, no symbols loaded for this document

我在Windows 7 64位+ Visual Studio 2015上尝试构建OpenImageIO时出现了这个问题。OpenImageIO库的编译二进制文件有一些问题,所以我想调试一些它的源代码来定位问题。但是断点没有命中。

具体来说,我用来调试OpenImageIO的应用程序代码是Tools\iconvert,当我执行到以下行时代码崩溃:

ImageInput *in = ImageInput::open (in_filename.c_str());

ImageInput::open 的实现包含在解决方案的项目 OpenImageIO 中的 imageinput.cpp 中。我在启用调试信息生成的调试配置下编译了这两个项目。但是当我在第86行的ImageInput::open的定义处设置断点时,断点是白色的,说明它是无效的,提示说断点当前没有被击中,如下截图所示:

我检查了其他地方,比如参考属性,它清楚地表明 iconvert 正在链接到 OpenImageIO 库的调试版本:

此外,调试配置设置正确(以我的理解):

那么,为什么断点打不上呢?我应该如何解决这个问题?如果您需要更多信息来解决问题,请告诉我。非常感谢。

大约一年前,我尝试使用PyCharm(Windows上的运行)远程调试里面执行的python脚本时遇到了类似的问题Autodesk Maya(运行 在 Linux 上)。后来我设法弄清楚这是由于 Linux 的路径引起的——它是一个旧的 python 脚本,位于 linux 中的搜索路径之一,即 运行我假设源文件夹中的脚本是 运行。所以我觉得这里的问题应该是一样的。

OpenImageIO依赖很多dll形式的第三方库,所以昨天我把它们都放到了C:\Windows\system32里方便查找。但是由于出现了一些问题,今天我更改了CMake的设置并重建,并且在重建过程中改变了主意,将新编译的dll放入OIIO的bin文件夹中(我不想弄乱系统目录)。为了使更改生效,我将此文件夹添加到 PATH 并从 system32 中删除了旧的有问题的 dll。但是我漏掉了一个——OpenImageIO.dll,它负责ImageInput::open!我太相信自己的记忆了;我应该按创建日期对文件进行排序。

当然一开始我并不知道,所以根据我以前的经验,我首先检查加载的dll是否是我刚刚构建的。这是通过 VS2015 中的菜单 DEBUG->Windows->Modules 完成的。啊哈,windows 清楚地表明加载的是 system32 中的 OpenImageIO.dll,这让我想起了发生了什么。所以我删除了(shift)那个旧的 dll,现在一切都按预期工作了——我终于在 Windows 7 64 位上从头开始使用 VS2015 成功构建了 OpenImageIO,包括所有第 3 方库。