【问题标题】:Visual studio c++ debugger unable to read memory when entering if statementVisual Studio C++ 调试器在输入 if 语句时无法读取内存
【发布时间】:2021-12-16 11:44:57
【问题描述】:

我正在使用 Visual Studio 2017。“资源”是图像中类函数的私有成员。一旦我进入第 3101 行,所有与“资源”相关的信息都会在第 3103 行丢失。我的意思是,所有成员都被标记为“无法读取内存”或???在监视对话框中。

最初,我认为有另一个线程正在改变这个结构,但事实并非如此。我可以在 3090 和 3103 之间拖动调试行,您可以看到调试资源的能力得到了(在 3090 行)和失去了(在 3103 行)。

第 3090 行第一次调试命中:

第 3105 行的第一次调试命中:

将调试器带回第 3090 行:

第 3105 行的第二次调试命中:

【问题讨论】:

  • 看起来变量被核弹了,原因在提供的示例中并没有立即显现出来。考虑制造minimal reproducible example,以后不要那么依赖图像。它们几乎没有一个好的、孤立的文本示例那么有用,潜在的回答者可以放入他们的工具并进行自己的调查。
  • 你在运行Debug项目配置吗?在 Release 中,您仍然可以调试,但一些变量被优化掉了。
  • 我建议查看您的函数的汇编语言列表。然后,您可以查看变量是否已放入寄存器。汇编语言列表还将显示变量是否被优化掉(例如,如果某个变量不再在一段代码中使用)。
  • @user4581301 我想如果我可以生成一个最小的可重现示例,我将能够创建问题,从而知道根本原因以及如何解决它。在这种情况下,我不必发布问题???我已经使用这个特定变量一年多了,没有任何问题,只是不确定为什么对于代码的这个特定部分突然出现问题。而在这个特殊的 else if 语句中。
  • @Eugene 感谢您的评论。我处于调试模式和混合平台。我绝对可以在代码中的任何地方调试和查看对象成员,我希望它是可见的(即在范围内)。它似乎只是这个特殊的 else if 语句,其中调试器似乎没有关于对象的信息。

标签: c++ debugging scope visual-studio-2017


【解决方案1】:

事实证明,一位同事在第 3101 行的“else if”语句中引入了一个与类作用域“资源”变量同名的变量。所以发生的事情是,当我进入这个级别时,它出现了调试器正在寻找与“else if”“resources”变量的尚未初始化的本地相关的信息,而不是类范围的“resources”变量。

有趣的是,资源的类实例仍然能够在“else if”范围内引用并返回预期值,但调试器无法提供所需的信息进行检查。仍然不确定调试器的机制如何工作,但只需更改“else if”作用域“资源”变量的名称即可解决调试器没有与类作用域资源变量关联的信息的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多