我遇到了一个非常奇怪的问题,其中某些变量的监视窗口值似乎与它们的“真实世界”值不匹配。调试器似乎空间不足。这是显示它的最小代码段:

printf("%d", pNodes[nNode].nColumn); // watch shows "4"
printf("%d", nColumn); // watch shows "1"

if (pNodes[nNode].nColumn != nColumn)
  continue; // this is NOT called

所以这是行为:
  • 如果将 watch 添加到pNodes[nNode].nColumn中,它将显示4的值。
  • 如果将 watch 添加到nColumn中,它将显示1的值。
  • 如果我在监视窗口中检查表达式pNodes[nNode].nColumn != nColumn,则其计算结果为true
  • 跳过continue语句!
  • 我添加了printf()调用以查看发生了什么,然后printf()打印值11,这似乎与代码“流”的方式一致(即,它没有在continue语句中调用if

    我什至可以通过&pNodes(nNode].nColumn检查内存,并且内存显示监视窗口向我显示的“不正确”值。因此,似乎调试器已与实际程序数据或某些东西完全“断开连接”。我正在运行调试构建优化已关闭。我还检查了pNodes是否不对应于某些全局变量或范围更高的其他变量-似乎只有一个本地版本。

    这完全让我感到困惑!我什至不知道下一步该怎么解决这个问题。如果您有任何想法,我很乐意听到!

    谢谢!

    最佳答案

    因此,我认为我已经破案了:罪魁祸首是结构成员对齐。我有一堆项目混合在一起,其中一些在项目内部对该领域具有不同的值(value)。我删除了所有设置,只是让VS选择默认设置,问题就消失了。

    适用的值在某些项目中为 4字节,在某些项目中为默认,在其他项目中为空。该值位于配置属性/C/C++/代码生成/结构成员对齐下。同样,我最后只是完全删除了项目的值。我认为这是在过去某个时候在项目上设置的,以处理某种跨平台问题,但至少对于我现在正在做的工作是固定的!

    感谢您所有的帮助!

  • 10-02 02:33