什么可能"打破调试器"在Visual Studio中(可能是std :: string?)

时间:2016-03-01 05:23:57

标签: c++ visual-studio debugging poco-libraries

考虑在下一行设置断点,并使用Visual Studio调试器(在完全清理和重建的调试版本中)进入它:

Poco::URI testUri( "http://somewhere.com/test/path" );

事实证明,此步骤将带您进入此功能:

URI::URI(const char* uri):
    _port(0)
{
    parse(std::string(uri));
}

事实证明,当你在parse()调用之后再多走几步并在最后一行停顿时,一切都在新构造的URI对象中,特别是:

  • 已正确解析;
  • 可以扩展this指针以查看正确分配的成员变量(例如,its_host,_path和_scheme成员设置为" somewhere.com"," / test / path&# 34;和" http"分别);
  • 此阶段的this指针指向合法内存(例如0x002AEE20)位置,在该位置可以看到我自信的是URI对象(一组std::string个变量,并且发生了一个int

然而,经过一步之后,一个人回到原始代码行,然后突然:

  • 扩展" Autos"中的testUri对象或"观看"调试器窗口导致std::string成员无法读取(有#34;错误读取字符串")但是......
  • 构造对象所在的内存保持不变,并且......
  • 确认testUri的地址指向未更改的内存

这怎么可能? VS调试器坏了吗?是什么打破了它?

这是一系列奇怪问题中的最新问题,试图让POCO库升级并进入多线程MFC项目。我不知道MFC或多线程是否应该对Poco产生任何影响,但我经历了一周的奇怪 - 通常涉及std::string个对象 - 而且我想去它的底部。所有关于追踪正在发生的事情的建议都非常感谢。如果有所作为,我正在运行VS2015社区。

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的,尝试在同一个项目中混合不同的构建(即发布和调试)会导致这样的问题。

然而,在这种情况下,混合了不同的编译器 - 大多数项目是在VS2010条件下构建的,而Poco库是在VS2015条件下构建的。

我不能100%确定之前编译更广泛项目的条件,因为它最近从VS2010升级到VS2015,在此过程中,Platform Toolset设置未显示在.vcxproj文件中。我现在(重新)为每个构建配置引入了Platform Toolset并将其设置为v100,并使用build_vs100.cmd脚本重建了Poco。现在一切似乎都按预期工作了。

我跟踪这个问题的方法是观察应用程序是用/MDd编译的(多线程调试DLL代码生成),但链接器试图链接到" d&#34 ; Poco库的版本,而不是" mdd"版本。当编译器排成一行时,链接器正确链接了" mdd"人们期望的版本。

由于Poco中的所有库链接都是自动的(请参阅#pragma中的PocoFoundation.h指令),因此更改了库选择错误(POCO_STATIC未被更改)定义)。我没有费心去检查这是为什么。