0

基本上我创建转储文件:

  1. 调试下:VC10 Debug->Save dump as...
  2. 正在发布:Procexp->右键单击->保存转储->创建完整转储...

通过1,我可以用VC10打开转储文件(符号路径,调试源文件都设置正确),我可以看到所有带有源代码的堆栈信息以及所有变量的值。

通过2,我可以用VC10打开转储文件(符号路径,调试源文件都设置正确),我可以看到所有带有源代码的堆栈信息但是所有变量的值都不存在。即使我将局部变量放入 Debug Watch 窗口,它也会显示错误:找不到符号“xxx”。我应该如何解决这个问题 2?

我是如何设置转储调试的?

对于符号路径:

操作->设置符号路径->为我的项目以及使用 Microsoft 符号服务器添加调试和发布文件夹的 pdb 路径。

对于调试源路径:

转储项目解决方案 -> 属性 -> 调试源文件 -> 添加我的项目文件夹

顺便说一句:对于同一个转储文件,我也使用了 WinDbg,我也可以看到所有的堆栈信息(在正确设置符号和源路径之后)。

谢谢

4

2 回答 2

2

调试版本是确保您获得最佳调试体验的版本。查看局部变量不是问题。

发布版本打开代码优化器。它对你的代码做了很多事情,但肯定是第一个受害者是局部变量。它们可能会被完全删除或存储在 CPU 寄存器中。如果您确实需要知道这样一个局部变量的值,那么您通常需要查看机器代码以找出 cpu 寄存器存储它的位置。但是,如果这是在隐藏在堆栈跟踪中的代码中,这将永远不会起作用,该值将被推入堆栈的某个地方。找出几乎不可能的地方。

调试优化代码很困难,没有两种方法。使用调试版本消除错误,Hail Mary 在发布版本中。

于 2012-12-13T16:19:18.130 回答
0

感谢所有不错的输入,但我想我今天自己找到了原因!

原因:这是一个构建问题,exe需要使用的一些组件没有正确构建!

注意:在我的例子中,“ mini dump ”7M 和“ full dump ”112M 做同样的工作,都是从 procexp 创建的。一旦我将它们加载到 VS 中,我就可以访问:

  1. 所有堆栈信息
  2. 所有变量信息
  3. 一旦我将堆栈从 kernel32.dll!_UnhandleExceptionFiler 切换到我的代码,它就会精确定位到确切的位置。

所以基本上只要你像我在上面和下面那样设置VC10,你应该没问题:

对于符号路径:

操作->设置符号路径->为我的项目以及使用 Microsoft 符号服务器添加调试和发布文件夹的 pdb 路径。

对于调试源路径:

转储项目解决方案 -> 属性 -> 调试源文件 -> 添加我的项目文件夹

于 2012-12-15T12:07:22.517 回答