pau*_*ulm 5 debugging windbg visual-c++ visual-studio-2013
每当我获得我的应用程序的x64版本构建的崩溃转储时,我发现它很少见,我可以查看本地人,这使得很难或无法解决一些问题.在x86中,我通常可以查看所有本地人没有任何问题.
发布版本中是否有任何编译器选项允许我在发布版本崩溃转储中查看本地?显然我不想关闭优化但也许有一些方法可以强制它来保存本地人,但性能影响很小?
Sea*_*ine 10
你说过一些暗示为什么你看不到当地人的东西......
#1 - 这是一个发布版本.
通过启用某些优化,编译器可以自由地执行一些操作,使查看本地更加困难.
#2 - 这是一个x64版本.
MSVC对64位代码使用了一种新的调用约定,称为x64调用约定.前4个函数参数存储在寄存器中而不是堆栈中.这意味着即使您正在查看堆栈帧,您也不会看到一些参数,如果寄存器在您查看它们时已被重用于其他内容,您甚至可能无法恢复它们.
那么现在怎么办?
现在我们知道你为什么会遇到这么困难的时候,让我们看看你能做些什么来解决上面的问题.这些问题都不是真正的阻止者,但是他们共同努力使事情变得更加困难.
关闭一些优化.您可以尝试使用不会妨碍调试的级别进行优化的发布版本.您可能希望从上面提到的使用堆栈帧(/ Oy和/ Ob)的优化开始.那么你需要希望你仍然能够在关闭这些优化的情况下重现这个问题.此外,根据您的内部政策以及您与客户签订的合同,您可能需要聘请律师才能向客户发送非正式的构建 - 可能不是世界上最有趣的事情.
构建更好的符号文件.VS2012和较高的有一个新的编译器开关,/ d2Zi +在VS2012和/莫宁在VS2013,当优化被打开,产生更好的调试信息.这使得调试优化代码与GCC/Clang相同.即使它在VS2012中没有记录,我仍然认为它非常安全,因为我看到生成的代码没有区别 - 只在符号文件中.您甚至可以使用此标志在本地重建并强制windbg通过使用新的符号文件.symopt+ 0x40.这使您有机会从已有的转储中获得更多.
使用windbg扩展来完成繁重的工作.在其他StackOverflow答案中,我提到了一个名为CMKD的工具,它已经保存了几次我的培根.除其他外,它尝试重新构建在寄存器中传递的x64调用约定中的参数.这不是一个肯定的事情,但它可能是让他们回来的最好希望.
无论如何,我希望我的ramblings在你的调试中证明是有用的.
| 归档时间: |
|
| 查看次数: |
240 次 |
| 最近记录: |