UE4调试手段:主动崩溃与“.pdb”解析“.dmp”文件

主动崩溃

尝试了一些做法,发现 check(false) 对于Development配置而言,是有效果的,代码如下:

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
    Super::BeginPlay();

    check(false); // 尝试用这个来主动崩溃
}

以Windows配置出包,并运行,能够成功崩溃:

VS解析出“.dmp”崩溃堆栈

理论:

在UE4中,PDB文件是一种调试符号文件,用于在程序崩溃或调试时提供有关代码的详细信息。PDB代表“Program Database”。

PDB文件包含了编译后的二进制可执行文件(如游戏客户端或服务器)的调试信息,包括函数、变量、类型信息以及源代码的映射关系。它与编译器生成的可执行文件相对应,可以帮助调试器在崩溃或调试时将二进制代码映射回源代码。

使用PDB文件,开发者可以在调试过程中获得更多的上下文信息,例如函数调用堆栈、变量的值和类型等。这对于定位和修复代码中的问题非常有帮助,特别是在复杂的代码库中。

在UE4中,当你构建项目时,编译器会生成PDB文件。这些PDB文件通常与生成的可执行文件一起分发给测试人员或其他开发者,以便在调试过程中使用。请注意,PDB文件通常比可执行文件本身要大,因为它们包含了额外的调试信息。

Pdb是如何产生的?在UE4中,.pdb文件是由Visual Studio编译器生成的。当我们在Visual Studio中编译UE4项目时,编译器会生成一个包含符号信息的调试信息文件,即.pdb文件。编译产生的位置是:{我的工程路径}\Binaries\Win64\{我的工程名}.pdb。

下面是解析出崩溃堆栈的实操做法:

一、使用Everything 在Demo工程中搜索到pdb如下:

{我的工程路径}\Binaries\Win64\{我的工程名}.pdb

二、找到崩溃文件:

{我的打包输出路径}\WindowsNoEditor\{工程名}\Saved\Crashes\UE4CC-Windows-9A446C114FA6E8653F612791A99C2D3E_0000\UE4Minidump.dmp

三、用VS打开我的工程.sln

四、VS中看到“仅限本机进行调试”,但点击前,需要先在VS的界面中点击“手动选择PDB”(sorry我没有截到图),并选择第一步骤里找到的pdb。再点击下图红框处

五、能够找到错误的代码:

额外的说明:

1、如果存在exe热更,那么无法解析出来。(关于exe热更可以参考:http://t.csdnimg.cn/T0NK1);

2、如果上面步骤“三、用VS打开我的工程.sln”改为“直接打开这个dmp文件,而不打开任何工程”,那么同样可以看到堆栈信息,但在双击堆栈中的代码时,会呼出cpp的选择界面,这意味着它没办法直接展示代码,而需要你手动找到源码:

3、通过手动指定pdb(文件夹)的方式,来进行解析

日志中PDB可解析出堆栈信息

一个打包好的Client在运行时崩溃,能看到堆栈信息(如下),能够看到具体的代码与行数,前提是pdb存在于该包中 (“我下载的项目运行包\项目名\Binaries\Win64\项目名Client.pdb”)


[2024.08.19-15.30.22:305][  0]LogWindows: Windows GetLastError: 操作成功完成。 (0)
[2024.08.19-15.30.27:127][  0]LogWindows: Error: === Critical error: ===
[2024.08.19-15.30.27:127][  0]LogWindows: Error: 
[2024.08.19-15.30.27:127][  0]LogWindows: Error: Fatal error: [File:F:/Stable_PC_Dev/EngineSource/Engine/Source/Runtime/Engine/Private/ShaderCompiler/ShaderCompiler.cpp] [Line: 4466] 
[2024.08.19-15.30.27:127][  0]LogWindows: Error: Missing global shader FXeSSVelocityFlattenCS's permutation 0, Please make sure cooking was successful.
[2024.08.19-15.30.27:127][  0]LogWindows: Error: 
[2024.08.19-15.30.27:127][  0]LogWindows: Error: 
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff80f82b699 KERNELBASE.dll!UnknownFunction []
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6d7690152 项目名Client.exe!ReportAssert() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Core\Private\Windows\WindowsPlatformCrashContext.cpp:1552]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6d766736a 项目名Client.exe!FWindowsErrorOutputDevice::Serialize() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Core\Private\Windows\WindowsErrorOutputDevice.cpp:84]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6d73fc2cd 项目名Client.exe!FOutputDevice::LogfImpl() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Core\Private\Misc\OutputDevice.cpp:71]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6dad159ac 项目名Client.exe!VerifyGlobalShaders() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Engine\Private\ShaderCompiler\ShaderCompiler.cpp:4470]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6dace8b88 项目名Client.exe!CompileGlobalShaderMap() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Engine\Private\ShaderCompiler\ShaderCompiler.cpp:4922]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6cc5997f8 项目名Client.exe!FEngineLoop::PreInitPreStartupScreen() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:2564]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6cc583a70 项目名Client.exe!FEngineLoop::PreInit() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:3604]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6cc57b82e 项目名Client.exe!EnginePreInit() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Launch\Private\Launch.cpp:126]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6cc57f8a2 项目名Client.exe!GuardedMain() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Launch\Private\Launch.cpp:222]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6cc57fc5a 项目名Client.exe!GuardedMainWrapper() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:144]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6cc5a20bf 项目名Client.exe!WinMain() [F:\Stable_PC_Dev\EngineSource\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:273]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff6dcc1913e 项目名Client.exe!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff811387374 KERNEL32.DLL!UnknownFunction []
[2024.08.19-15.30.27:127][  0]LogWindows: Error: [Callstack] 0x00007ff811fdcc91 ntdll.dll!UnknownFunction []
[2024.08.19-15.30.27:127][  0]LogWindows: Error: 
[2024.08.19-15.30.27:140][  0]LogExit: Executing StaticShutdownAfterError

 

如果pdb不存在,或者是exe被替换( 关于exe热更可以参考:http://t.csdnimg.cn/T0NK1),那么堆栈名称就看不到,如下:

[2024.08.19-16.50.23:269][  0]LogWindows: Windows GetLastError: 操作成功完成。 (0)
[2024.08.19-16.50.23:745][  0]LogWindows: Error: === Critical error: ===
[2024.08.19-16.50.23:745][  0]LogWindows: Error: 
[2024.08.19-16.50.23:745][  0]LogWindows: Error: Fatal error: [File:G:/St/EngineSource/Engine/Source/Runtime/Engine/Private/ShaderCompiler/ShaderCompiler.cpp] [Line: 4466] 
[2024.08.19-16.50.23:745][  0]LogWindows: Error: Missing global shader FXeSSVelocityFlattenCS's permutation 0, Please make sure cooking was successful.
[2024.08.19-16.50.23:745][  0]LogWindows: Error: 
[2024.08.19-16.50.23:745][  0]LogWindows: Error: 
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff80f82b699 KERNELBASE.dll!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff79da44834 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff79da1b3dd 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff79d79c050 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff7a1059e8c 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff7a102d3d1 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff793ebe07a 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff793ea8321 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff793e9fd1c 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff793ea4022 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff793ea43da 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff793ec6d14 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff7a2b89a4e 项目名Client.exe!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff811387374 KERNEL32.DLL!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: [Callstack] 0x00007ff811fdcc91 ntdll.dll!UnknownFunction []
[2024.08.19-16.50.23:745][  0]LogWindows: Error: 
[2024.08.19-16.50.23:759][  0]LogExit: Executing StaticShutdownAfterError

日志中包含堆栈信息(未成功)

我希望直接在日志中打印出堆栈信息,这样就不需要主动崩溃了,但没有成功。

根据 https://zhuanlan.zhihu.com/p/374231773  、 虚幻引擎应用实例分享(十):虚幻的断言 | indienova 独立游戏  、  https://hackmd.io/@NotYet/SypDZX_SL   的介绍,使用FDebug::DumpStackTraceToLog(TEXT("日志的自定义开头H")),含义是以H字串开头的日志会自动打印堆栈,代码如下:

bool FPakPlatformFile::Mount(const TCHAR* InPakFilename, uint32 PakOrder, const TCHAR* InPath /*= NULL*/, bool bLoadIndex /*= true*/)
{
    // 将 LogPakFile 开头的信息都打印出堆栈
    FDebug::DumpStackTraceToLog(TEXT("LogPakFile"));

    // 我希望有堆栈的日志:
    UE_LOG(LogPakFile, Error, TEXT("watch trace_info2 %s  \n \"%s\" until encryption key '%s' becomes available"),  InPakFilename, InPath);

实际运行时,看到都是Unknown。

Error: LogPakFile
Error: 
Error: [Callstack] 0x00007ff7f17f9452 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f17faad1 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f17f249e 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7eeb03adc 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f1a675c6 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f2bb6ccf 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f1ffe967 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f2b63ede 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f2a8d096 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f2a30241 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f201ef5b 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee186617 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee19d0b9 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee1a1c55 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee1a1e6a 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee1c4144 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f3c53ade 项目名.exe!UnknownFunction []
Error: [Callstack] 0x00007ffc077e7374 KERNEL32.DLL!UnknownFunction []
Error: [Callstack] 0x00007ffc08d3cc91 ntdll.dll!UnknownFunction []

暂不深究。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值