小编Lau*_*ent的帖子

从本机到托管转换后,Visual Studio 调试器值错误

一般说明

我在调试 Visual Studio 项目时遇到问题。该项目有一个大型的中心类“MachineControl”。它还将当前所处的状态存储为枚举类的值。在尝试修复不相关的错误时,我设置了一些条件断点来解决它。经过一些令人困惑的情况后,我意识到从调试器获得的信息是错误的。代码运行时的值与调试器显示的值不同。

mState 在鼠标悬停时显示错误值

这个值是错误的,因为当我单步执行代码时,它实际上表现得好像处于 StateEnum::Running(1) 状态。

IDE 和代码信息

在与调试器相关的所有内容中发现错误信息:

  • 通过调试器鼠标悬停显示
  • 用于条件断点
  • 汽车
  • 当地人
  • 手表
  • 《即时之窗》
  • 内存视图

正确信息:

  • std::cout
  • 代码行为
  • 记录

环境:

  • 微软 Visual Studio 专业版 2019,16.9.0

代码:

  • MachineControl 类中的单线程本机代码
  • 托管 C++ GUI 项目围绕本机 C++ 静态库调用托管模拟包装器 DLL(这解释了后面提到的“托管到本机”转换)

代码示例

错误的调试信息发生在难以隔离的点。可悲的是,我无法生成一个最小的可重复示例。以下代码片段是我必须显示问题发生的一般情况的最简单的说明性代码:

class MachineControl : public EventReceiver <Evt>
{
    StateEnum mState;
public:
    void onEventReceived(const Evt& evt) override;
    void processPeriodicTimer();
    //...
};

void MachineControl::onEventReceived(const Evt& event) // called by other class through managed to native transition
{
    switch (mState) // shows wrong information …
Run Code Online (Sandbox Code Playgroud)

c++ debugging c++-cli visual-studio visual-studio-debugging

5
推荐指数
0
解决办法
454
查看次数