gpt4 book ai didi

c++ - Visual Studio 中的 "break the debugger"可能是什么(也许是 std::string?)

转载 作者:行者123 更新时间:2023-11-28 05:48:44 25 4
gpt4 key购买 nike

考虑在以下行中设置断点,并使用 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”和“http”);
  • this此阶段的指针指向合法内存(例如 0x002AEE20)位置,在该位置可以看到我确信的 URI 对象(一组 std::string 变量,以及一个 int 碰巧)。

然而,再一步之后,又回到原来的代码行,突然:

  • 扩展testUri “Autos”或“Watch”调试器窗口中的对象导致 std::string无法读取的成员(存在“读取字符串字符时出错”),但...
  • 构造对象所在的内存保持不变,并且...
  • 地址testUri确认指向未改变的内存

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

这是尝试启动 POCO 库并在多线程 MFC 项目中运行的一系列奇怪问题中的最新问题。我不知道 MFC 或多线程是否会对 Poco 产生任何影响,但我经历了一周的怪异——通常是 std::string涉及的对象——我想弄个水落石出。非常感谢所有跟踪正在发生的事情的建议。如果有所作为,我正在运行 VS2015 社区。

最佳答案

如评论中所述,尝试在同一项目中混合不同的构建(即发布和调试)可能会导致此类问题。

然而,在这种情况下,它是不同编译器的混合——大部分项目是在 VS2010 条件下构建的,而 Poco 库是在 VS2015 条件下构建的。

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

我追踪这个的方法是观察应用程序正在使用 /MDd(多线程调试 DLL 代码生成)编译,但链接器试图链接到“d” Poco 库的版本,而不是“mdd”版本。当编译器符合要求时,链接器会像预期的那样正确链接“mdd”版本。

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

关于c++ - Visual Studio 中的 "break the debugger"可能是什么(也许是 std::string?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35715265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com