【发布时间】:2016-07-07 08:27:19
【问题描述】:
我正在尝试在 Visual Studio 中单步执行 C/C++ 程序 (MapServer),但看不到局部变量。
我通过添加从源代码构建的主 .exe 创建了一个新项目。我可以毫无问题地设置断点并逐步执行程序,但我看不到任何变量中存储的内容。我在虚拟机上运行所有这些 - 主机操作系统是 Windows 10,VM 是 Windows 7。
程序是:
- 作为调试版本构建
- 没有优化
- 符号加载正常
我相当肯定这是因为它是 x64 位版本,因为我可以使用完全相同的方法进行 x32 构建并查看变量。
x32 调试器示例(前 5 个变量正确 - 其他未设置):
x64 调试会话示例(注意程序运行良好):
我认为可能是VS2008的原因,所以我也在VS2015中尝试过,但结果相似(失败):
尝试访问即时窗口中的变量会产生:
// working VS2008 x32 build
map->name
0x00ffcb40 "WFS_server"
// VS2008 x64 build
map->name
0x0000000000000000 <Bad Ptr>
// VS2015 x64 build
map->name
0x0000000000000000 <NULL>
我是否缺少 Visual Studio 中的一些调试器设置来将调试项目设置为 x64?或者在产生这个的源代码中是否存在一些转换问题?
任何指针表示赞赏..
【问题讨论】:
-
您可能想尝试修复您的 VS 安装(程序和功能 -> VS -> 修改 -> 修复)。我不知道您是否遇到相同的问题,或者相同问题的不同风味,但是当我想测试是否可以重现您的问题时,我意识到我无法启动带有调试器的应用程序。 MSVSMON.exe 将无法启动(更奇怪的是:它会尝试使用 VS2010 的 MSVSMON,而我正在使用 VS2012)。安装修复解决了这个问题(是的,我可以很好地看到所有变量的值)。
-
@AlgirdasPreidžius 感谢您的建议。我有一个全新安装的 2015 年,刚刚修复了 2008 年,没有任何变化。这一切都在虚拟机上运行,我猜这可能是问题的一部分。
-
如果您在调试视图中看到 0xbaadfood,那么“它一定是调试器中的错误”不是您首先考虑的问题。 VS2008 和 VS2015 也使用非常不同的调试引擎。堆损坏是一个非常常见的错误,并且具有非常随机的行为,不保证会导致程序失败。
-
@HansPassant - 我的第一个想法是我缺少一些 VS 设置来启用 64 位调试。其次,代码存在一些问题。重新截图中的“0xbaadfood”值 - 这些是正确的,因为没有为“fontset”属性设置值。但是“名称”属性已设置 - 并以 32 位版本显示。
标签: c++ visual-studio 64-bit 32bit-64bit mapserver