主动崩溃
尝试了一些做法,发现 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文件通常比可执行文件本身要大,因为它们包含了额外的调试信息。
下面是解析出崩溃堆栈的实操做法:
一、使用Everything 在Demo工程中搜索到pdb如下:
{我的工程路径}\Binaries\Win64\{我的工程名}.pdb
二、找到崩溃文件:
{我的打包输出路径}\WindowsNoEditor\{工程名}\Saved\Crashes\UE4CC-Windows-9A446C114FA6E8653F612791A99C2D3E_0000\UE4Minidump.dmp
三、用VS打开我的工程.sln
四、VS中看到“仅限本机进行调试”,但点击前,需要先在VS的界面中点击“手动选择PDB”(sorry我没有截到图),并选择第一步骤里找到的pdb。再点击下图红框处
五、能够找到错误的代码:
日志中包含堆栈信息(未成功)
我希望直接在日志中打印出堆栈信息,这样就不需要主动崩溃了,但没有成功。
根据 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 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f17faad1 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f17f249e DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7eeb03adc DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f1a675c6 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f2bb6ccf DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f1ffe967 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f2b63ede DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f2a8d096 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f2a30241 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f201ef5b DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee186617 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee19d0b9 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee1a1c55 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee1a1e6a DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7ee1c4144 DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ff7f3c53ade DeltaForce.exe!UnknownFunction []
Error: [Callstack] 0x00007ffc077e7374 KERNEL32.DLL!UnknownFunction []
Error: [Callstack] 0x00007ffc08d3cc91 ntdll.dll!UnknownFunction []
暂不深究。