gpt4 book ai didi

c++ - VS 2015 : The breakpoint will not currently be hit. 没有为此文档加载符号

转载 作者:行者123 更新时间:2023-11-30 03:48:32 25 4
gpt4 key购买 nike

问题

我有一个 C++ (*.cpp) 文件,它是我无法放置事件断点的静态库项目的一部分。当我这样做时,它会给我在这篇文章的标题中看到的通知。 我可以在同一个项目的任何其他 C++ 文件中放置断点,它会在调试期间被击中 .这个 C++ 文件没有什么特别之处。我使用 CMake 生成项目,并且还引用了可执行项​​目中的类。没有链接错误,只是调试器说没有为该源文件加载调试符号。我尝试了几种方法来尝试诊断出了什么问题,但我对我的情况没有很好的答案。

我试过的

  • 将此文件与同一项目中的其他 *.cpp 文件进行比较 :我交叉检查了这个文件和我测试的其他文件之间的编译器标志,以验证是否能够放置一个有效的断点。没有什么不同。
  • 重建整个解决方案 : 你可能已经猜到了,这并没有帮助
  • 使用 CMake 重新创建整个解决方案: 这也没什么区别。
  • 在具有 main() 的源文件中包含该文件并引用该文件中的类 : 这造成了不同。我能够在类中放置断点,并且它的代码正在执行,而在以前,它不是。

  • 有关代码的更多信息
  • 我指的 C++ 文件是 RoCreateCharacterSuccess.cpp
  • roREGISTER_PACKET 的工作是在应用程序初始化时将这个数据包类注册到另一个类( RoPacketTranslator )。
  • constructor of RoCreateCharacterSuccess 在注册数据包类时被调用。
  • 当断点不活动时,不会调用此构造函数。我知道这一点是因为这个数据包类在它应该注册的类中不存在。就像 RoCreateCharacterSuccess.cpp绝不是它应该在的静态库的一部分。但是,如果我故意更改文件以引入语法错误,则库将无法构建。
  • 为了使该文件能够具有事件断点,我必须在应用程序中手动向翻译器注册数据包。

  • 有没有其他人见过这样的问题?在这一点上,我很难理解发生了什么。任何有助于了解这里发生的事情都会很棒!感谢您花时间阅读这个问题。

    编辑 : 我忘了说这个问题是诊断出来的,因为我试图诊断为什么角色创建包没有被翻译成 RoCreateCharacterSuccess。对象当 the character gets successfully created .后来发现 RoCreateCharacterSuccess类(class)未注册到 RoPacketTranslator类(class)。试图放置一个断点来检查构造函数是否被调用会导致这个问题。

    解决方案

    感谢@user1,我知道发生了什么。所以,在我的可执行文件中, where I refer to this class (or an instance of it) , 我只访问 RoCreateCharacterSuccess::getCharacter() ,它在头文件中,可能被编译器内联到可执行文件中。就编译器所见,这是我与该类的唯一交互。我没有调用它的 constructor, which was defined in the cpp file .这意味着编译器有机会优化那部分代码(我确实打开了该选项)。

    解决方案 :我移动了我与之交互的唯一方法的定义, RoCreateCharacterSuccess::getCharacter() , 到 cpp 文件中,因此避免内联并强制编译器链接到定义 RoCreateCharacterSuccess 的静态库的那部分类,从而触发注册 RoCreateCharacterSuccess 的行为与翻译类一起上课。

    最佳答案

    首先,我没有看到任何问题 这里。这不是 C++ 编译器或链接器的问题。

    I can put breakpoints in any other C++ file in that same project and it will be hit during debugging. There's nothing special about this C++ file. I use CMake to generate the projects and I also refer to the class in the executable project. There are no linking errors, just that debugger says that no debug symbols have been loaded for that source file.



    这里真正发生的是,当您的可执行程序没有看到对模块的显式调用时 - RoCreateCharacterSuccess.cpp在您的静态库中,它不会链接到模块。

    如果程序需要模块中定义的符号,则该模块将被链接;如果没有,它将被跳过。因此,RoCreateCharacterSuccess.cpp 中的任何函数、符号模块永远不会存在。

    RoCreateCharacterSuccess.cpp被认为是未使用的模块。

    由于尚未为模块加载符号,因此 Visual Studio 最终会报告断点不会被命中。这是显而易见的。

    To make this file be able to have active breakpoints, I have to manually register the packet with the translator in the application.



    当您在应用程序中使用翻译模块手动注册数据包时,RoCreateCharacterSuccess.cpp模块已链接并且断点可用。您能够在该模块中命中断点。

    It's like RoCreateCharacterSuccess.cpp is never part of the static library it's supposed to be in. But if I purposefully change the file to introduce a syntax error, the library fails to build.



    顺便说一句,这对任何程序都是如此,任何语法错误都会导致编译失败。我知道您这样做是为了检查您的程序是否加载了正确的模块,但这确实不是问题。

    更新 @Vite Falcon 我很高兴我的回答提示您找出断点未激活的原因。显然,是编译器优化了内联函数调用并打破了模块和程序之间的联系。

    关于c++ - VS 2015 : The breakpoint will not currently be hit. 没有为此文档加载符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33137313/

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