gpt4 book ai didi

debugging - 是否有任何编译器选项可以使 x64 版本崩溃转储更有用?

转载 作者:行者123 更新时间:2023-12-04 17:18:37 24 4
gpt4 key购买 nike

每当我获得我的应用程序的 x64 版本版本的故障转储时,我发现很少能看到本地文件,这使得修复某些问题变得困难或不可能。在 x86 中,我通常可以毫无问题地查看所有本地人。

发布版本中是否有任何编译器选项可以让我查看发布版本崩溃转储中的本地信息?显然我不想关闭优化,但也许有某种方法可以强制它以较小的性能影响来保存本地人?

最佳答案

你说了几句话暗示你为什么看不到本地人......

#1 - 这是一个发布版本。

启用某些优化后,编译器可以自由地做一些使查看局部变量变得更加困难的事情。

  • 可以inline一个函数。发生这种情况时,未优化掉的函数的局部变量与调用堆栈帧混合在一起。
  • 它可以使用名为 Frame-Pointer Omission 的技巧释放一个寄存器并在函数调用中节省几个时钟周期。 .
  • 为了节省栈空间,编译器可以reuse the location在函数体中较早地保存一个变量以在函数中稍后保存一个不同的变量。这意味着您在函数中的位置决定了您实际上能够看到哪些本地人。

  • #2 - 这是一个 x64 构建。

    MSVC 使用新的 64 位代码调用约定,恰本地称为 x64 Calling Convention .前 4 个函数参数存储在寄存器中而不是堆栈中。这意味着即使您正在查看堆栈帧,您也不会看到某些参数,并且如果在您查看它们时寄存器已被重用于其他用途,您甚至可能无法恢复它们。

    那么现在怎么办?

    现在我们知道为什么您会遇到如此困难的时期,让我们看看您可以做些什么来解决上述问题。这些问题都不是真正的障碍,但它们共同作用使事情变得更加困难。
  • 关闭一些优化。 您可以尝试使用发布版本进行优化,并在不妨碍调试的情况下进行优化。您可能希望从上面提到的使用堆栈帧(/Oy 和/Ob)的优化开始。那么您需要希望在关闭这些优化的情况下仍然可以重现该问题。此外,根据您的内部政策和您与客户签订的契约(Contract),在向客户发送非官方构建之前,您可能需要聘请律师——这可能不是世界上最有趣的事情。
  • 构建更好的符号文件。 VS2012 及更高版本有一个新的编译器开关,/d2Zi+ in VS2012/Zo in VS2013 ,当优化打开时会生成更好的调试信息。这使得调试优化的代码与 GCC/Clang 相当。即使它在 VS2012 中没有记录,我仍然认为它非常安全,因为我在生成的代码中没有看到任何区别——仅在符号文件中。您甚至可以使用此标志在本地重建,并通过 .symopt+ 0x40 强制windbg 使用您的新符号文件。 .这使您有机会从已有的转储中获得更多。
  • 使用 windbg 扩展来完成繁重的工作。 other StackOverflow answers ,我提到了一个名为 CMKD 的工具这救了我几次培根。除其他外,它尝试重构在寄存器中传递的 x64 调用约定中的参数。这不是一件确定的事情,但这可能是让他们回来的最大希望。

  • 无论如何,我希望我的散文能对您的调试有所帮助。

    关于debugging - 是否有任何编译器选项可以使 x64 版本崩溃转储更有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27720123/

    24 4 0