考虑在下一行设置断点,并使用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
。然而,经过一步之后,一个人回到原始代码行,然后突然:
testUri
对象或"观看"调试器窗口导致std::string
成员无法读取(有#34;错误读取字符串")但是...... testUri
的地址指向未更改的内存这怎么可能? VS调试器坏了吗?是什么打破了它?
这是一系列奇怪问题中的最新问题,试图让POCO库升级并进入多线程MFC项目。我不知道MFC或多线程是否应该对Poco产生任何影响,但我经历了一周的奇怪 - 通常涉及std::string
个对象 - 而且我想去它的底部。所有关于追踪正在发生的事情的建议都非常感谢。如果有所作为,我正在运行VS2015社区。 p>
答案 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
未被更改)定义)。我没有费心去检查这是为什么。