Visual Studio 如何使用minidump从完全优化的发布模式下构建的可执行文件中获取可读的调用堆栈?

amrnrhlw  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(100)

我想分发和可执行文件内置在C++与释放模式的充分优化。我正在生成一个核心转储的情况下,未处理的异常,我希望能够得到一个可读的调用堆栈的minidump。
我在网上看到一些使用/DEBUG选项的解决方案,但是当我启用该选项时,可执行文件会明显变大。我的担忧是:

  • 也许visual studio在exe中嵌入了信息,以便更容易对其进行反向工程
  • 它不是完全优化的可执行文件,因为它没有/DEBUG选项

否则为什么文件会更大?
有没有可能只保留一个文件中的调试信息(pdb文件不就是用来做这个的吗?),这样就足以重建调用堆栈了?
我是否必须启用其他选项和/DEBUG,这样exe就不会增加大小?
我不一定对具体是哪个指令导致问题感兴趣,但至少我需要对调用堆栈进行可靠且可读的重建,以便我可以识别负责崩溃的函数。

mwkjh3gx

mwkjh3gx1#

您可能需要/ZI/Zi选项沿着/DEBUG:FULL
在内部为每个版本归档.pdb文件是非常标准的做法。然后,当客户报告崩溃时,内存转储可以与正确版本的调试信息相匹配,调试器会给出一个不错的堆栈跟踪。
存档产品附带的任何.dll的调试信息。如果崩溃发生在.dll代码中,则调试器将无法在没有.pdb的情况下创建合理的堆栈跟踪。

kmb7vmvb

kmb7vmvb2#

正如@veefu所提到的,需要/Zi/DEBUG选项,但这仍然会使大小更大。
但事实证明,/OPT:REF选项也是需要的,因为/DEBUG会自动禁用它,因此您需要显式地重新声明它。
下面是使用CMake时需要设置的内容:

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF")

相关问题