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 []

暂不深究。

<think>好的,用户的问题是关于Unreal Engine打包后长时间运行崩溃的问题,特别是TJGangHang_Win64_Shipping版本的崩溃报错。我需要根据提供的引用和现有知识来分析和解答这个问题。 首先,用户提到的三个引用都是关于Unreal Engine在不同平台上的安装、生成和打包过程中遇到的错误。引用[1]是关于下载依赖失败,引用[2]是Linux下编译时的make错误,引用[3]则是Linux打包时遇到的链接错误。虽然用户的问题是关于长时间运行后的崩溃,可能这些引用中的问题不同,但可能需要考虑类似的系统或配置问题。 接下来,我需要思考可能导致长时间运行后崩溃的常见原因。通常,这类问题可能涉及内存泄漏、资源管理不当、多线程问题、第三方插件兼容性、硬件资源不足等。此外,编译选项如Shipping配置可能关闭了某些调试功能,导致难以捕捉错误。 用户的需求是找到崩溃的原因和解决方法。因此,我需要分步骤引导用户进行排查,同时结合已有的引用信息。例如,引用[3]提到的链接错误可能代码中的字符串处理有关,但长时间运行的崩溃可能涉及更深层次的代码问题或资源泄漏。 可能的解决方案步骤包括检查日志文件、使用诊断工具检测内存泄漏、验证第三方插件、测试不同配置等。需要确保用户了解如何获取崩溃日志,并指导他们使用工具如Unreal Insights或Visual Studio调试器进行分析。 此外,考虑到用户可能在Windows平台打包(因为问题中提到了Win64_Shipping),但引用中的问题多涉及Linux,可能需要区分平台相关的问题。不过,长时间运行的崩溃通常更可能代码本身而非特定平台相关。 最后,生成相关问题时,需要围绕崩溃的常见原因、UE4调试工具、性能优化、内存管理等方面展开,帮助用户全面了解可能的问题点。</think>### Unreal Engine打包后长时间运行崩溃问题的分析解决步骤 #### 1. 初步诊断:获取崩溃日志 - **查看崩溃日志位置**:在打包后的`Saved/Crashes`目录中查找`.log`和`.dmp`文件,记录调用堆栈和错误代码[^3]。 - **启用详细日志**:在打包命令中添加`-LogCmds="LogInit verbose,LogScript verbose,LogCore verbose"`参数,生成更详细的运行日志[^2]。 #### 2. 常见崩溃原因分析 - **内存泄漏**:使用`Unreal Insights`工具检测内存使用趋势,观察是否存在未释放资源。例如: $$ \text{内存泄漏量} = \sum_{t=0}^{T} (alloc\_count(t) - free\_count(t)) $$ - **多线程竞争**:通过`Visual Studio`附加调试器检查线程状态,注意`std::string`相关操作在跨平台时可能引发异常。 - **第三方插件兼容性**:临时禁用所有第三方插件,逐步重新激活以定位问题模块。 #### 3. Shipping模式特殊处理 - **关闭优化测试**:尝试在`Development`模式下打包运行,观察是否仍会崩溃。Shipping模式可能隐藏堆栈信息,可使用`-Debug`参数重新编译: ```bash Build.bat TJGangHang Win64 Development -Debug ``` - **符号文件生成**:打包时保留`.pdb`文件,用于崩溃时的堆栈解析。 #### 4. 硬件资源排查 - **监控GPU/CPU温度**:使用`HWMonitor`等工具检测长时间运行时的硬件状态,排除过热导致的随机崩溃。 - **显存检测**:通过`stat unit`命令查看显存占用,确认是否超出显卡容量。 #### 5. 代码级调试方法 - **静态分析**:使用`PVS-Studio`或`Clang Static Analyzer`扫描代码,检测潜在的空指针访问等问题。 - **热重载检测**:在编辑器中运行`Cooked`内容时,通过`Live Coding`功能定位实时修改引发的问题。 #### 6. 已知引擎缺陷处理 - **字符串处理优化**:若出现`std::__1::basic_string`相关错误,检查所有字符串操作是否遵循UE4的`FString`规范。 - **物理系统配置**:将`Chaos Physics`替换为`PhysX`进行测试,部分版本存在物理模拟内存泄漏。 #### 示例调试命令流程 ```powershell # 1.调试符号打包 UE4Editor-Cmd.exe TJGangHang.uproject -run=Cook -targetplatform=Win64 UE4Editor-Cmd.exe TJGangHang.uproject -run=Export -Debug # 2. 附加调试器 devenv /debugexe TJGangHang\Binaries\Win64\TJGangHang-Win64-Shipping.exe # 3. 内存分析 UnrealInsights.exe trace.utrace --memreport ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值