由procexp(MS process explorer)创建的VC10调试转储文件-只有堆栈信息,没有变量值
VC10 debugging dump file create by procexp(MS process explorer) - only stack information no variable value
基本上我创建转储文件:
- 调试下:VC10调试->将转储另存为
- 发布中:Procexp->右键单击->保存转储->创建完整转储
通过1,我可以打开带有VC10的转储文件(符号路径,调试源文件所有设置正确),我可以看到带有源代码的所有堆栈信息以及所有变量的值。
通过2,我可以用VC10打开转储文件(符号路径,调试源文件所有设置正确),我可以看到所有源代码的堆栈信息,但所有变量的值都不存在。即使我将本地变量放入Debug Watch窗口,它也会显示错误:找不到符号"xxx"。我应该如何为2修复此问题?
我是如何设置转储调试的
对于符号路径:
操作->设置符号路径->为调试添加pdb路径;为我的项目以及使用Microsoft Symbol服务器发布文件夹。
对于调试源路径:
转储项目解决方案->属性->调试源文件->添加我的项目文件夹
BTW:对于同一个转储文件,我也使用了WinDbg,我也可以看到所有的堆栈信息(在正确设置符号和源路径之后)。
感谢
调试构建是确保您获得最佳调试体验的构建。查看局部变量不是问题。
发布版本将启用代码优化器。它对代码做了很多的事情,但第一个受害者肯定是局部变量。它们可能会被完全删除或存储在CPU寄存器中。如果你真的需要知道这样一个局部变量的值,那么你通常需要查看机器代码,以找出存储它的cpu寄存器。然而,如果这是隐藏在堆栈跟踪中的代码,那么这将永远不会起作用,因为该值会被推送到堆栈的某个位置。找出哪里几乎是不可能的。
调试优化后的代码很难,没有两种方法。通过调试构建消除错误,在发布构建时向玛丽致敬。
感谢您提供的所有好的输入,但我想我今天自己已经找到了原因!
原因:这是一个生成问题,exe需要使用的一些组件没有正确生成!
注意:在我的案例中,">迷你转储"7M和">full-dump"112M执行相同的工作,都是从procexp创建的。一旦我把它们加载到VS中,我就可以访问:
- 所有堆栈信息
- 所有变量信息
- 一旦我将堆栈切换到代码,它就会精确定位来自kernel32.dll_UnhandleExceptionFiler
所以本质上只要你像我上面所做的那样设置VC10,&下面,你应该没事:
对于符号路径:
操作->设置符号路径->为调试添加pdb路径;为我的项目以及使用Microsoft Symbol服务器发布文件夹。
对于调试源路径:
转储项目解决方案->属性->调试源文件->添加我的项目文件夹
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- Visual Studio C++ 它只构建选项卡中显示的文件吗?
- 用"=default"声明的函数应该只在头文件中执行
- 为什么这个加载函数只抓取文件中的第一件事?
- 是否可以在文本文件中找到最长单词的长度,并在同一个文本文件中读取,只需 1 个 while 循环?
- 我的C++程序只写入文本文件最后一个条目
- glob只给出匹配模式的第一个文件
- 如果您只需要在 .h 文件中声明函数.cpp是否需要在 .h 文件中声明函数?
- 通过包含<iostream>头文件,它的所有 8 个函数是写入我的代码,还是只写入我在程序中使用的函数?
- 我可以只从带有 Ctags 的C++文件中获取 #includes 吗?
- 我只想从文本文件中删除一个特定值或行
- 为什么SDL_RWFromFile(文件,"w+")不能像它应该的那样读写?它只打开文件进行写入
- 如何使用QPixmap,以便在地址中只需要使用项目文件夹
- tellg() 只对小文件返回 -1
- 无法弄清楚为什么只从文件中读取一行矩阵以及为什么我无法将 2D 数组传递给函数
- Ofstream 正在创建一个文件,但只写入起始词而不是完整字符串
- 我应该只对原始 cpp 文件使用 add_executable() 还是通过 add_library() 创建一个库
- 使用c++只读取已格式化和未格式化数据的文件中的已格式化数据
- 试图写入文件,但只打印一次
- 为什么一个成员函数只存在一次,甚至在一个包含多个的.h文件中定义?