0%

Unreal4: 打印当前调用栈

在 StartupModule() 中添加调用栈输出的方法 方法 1:使用 FPlatformStackWalk::StackWalkAndDump

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "HAL/PlatformStackWalk.h"  // 需要添加这个头文件

void FGPULightmassModule::StartupModule()
{
UE_LOG(LogGPULightmass, Log, TEXT("GPULightmass module is loaded"));

// 输出调用栈
ANSICHAR StackTrace[65536] = {0};
constexpr int32 NumStackFramesToIgnore = 1; // 忽略当前函数本身
FPlatformStackWalk::StackWalkAndDump(StackTrace, UE_ARRAY_COUNT(StackTrace), NumStackFramesToIgnore, nullptr);

// 将 ANSI 字符串转换为 FString 并输出
FString StackTraceString = ANSI_TO_TCHAR(StackTrace);
UE_LOG(LogGPULightmass, Log, TEXT("Call Stack:\n%s"), *StackTraceString);

// Maps virtual shader source directory /Plugin/GPULightmass to the plugin's actual Shaders directory.
FString PluginShaderDir = FPaths::Combine(IPluginManager::Get().FindPlugin(TEXT("GPULightmass"))->GetBaseDir(), TEXT("Shaders"));
AddShaderSourceDirectoryMapping(TEXT("/Plugin/GPULightmass"), PluginShaderDir);

FStaticLightingSystemInterface::Get()->RegisterImplementation(FName(TEXT("GPULightmass")), this);
}
方法 2:使用 CaptureStackBackTrace
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "HAL/PlatformStackWalk.h"

void FGPULightmassModule::StartupModule()
{
UE_LOG(LogGPULightmass, Log, TEXT("GPULightmass module is loaded"));

// 捕获调用栈地址
constexpr int32 MaxDepth = 20;
uint64 BackTrace[MaxDepth] = {0};
uint32 CapturedDepth = FPlatformStackWalk::CaptureStackBackTrace(BackTrace, MaxDepth);

// 输出调用栈
UE_LOG(LogGPULightmass, Log, TEXT("Call Stack (Depth: %d):"), CapturedDepth);
for (uint32 i = 0; i < CapturedDepth; ++i)
{
FProgramCounterSymbolInfo SymbolInfo;
FPlatformStackWalk::ProgramCounterToSymbolInfo(BackTrace[i], SymbolInfo);

UE_LOG(LogGPULightmass, Log, TEXT(" [%d] %s!%s [%s:%d]"),
i,
ANSI_TO_TCHAR(SymbolInfo.ModuleName),
ANSI_TO_TCHAR(SymbolInfo.FunctionName),
ANSI_TO_TCHAR(SymbolInfo.Filename),
SymbolInfo.LineNumber);
}

}

方法3: 使用 UE4 的调试宏 ``` c++ #include “HAL/PlatformStackWalk.h”

void FGPULightmassModule::StartupModule() { UE_LOG(LogGPULightmass, Log, TEXT(“GPULightmass module is loaded”));

// 使用 UE4 的调用栈输出
ANSICHAR StackTrace[65536] = {0};
FPlatformStackWalk::StackWalkAndDump(StackTrace, UE_ARRAY_COUNT(StackTrace), 1, nullptr);

// 直接输出到日志
UE_LOG(LogGPULightmass, Warning, TEXT("=== StartupModule Call Stack ===\n%s"), ANSI_TO_TCHAR(StackTrace));

// ... 其余代码

}

×