diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py /home/jyelon/integration.UE/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py --- /home/jyelon/integration.UE.orig/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py 2025-03-11 10:33:14.000000000 -0400 +++ /home/jyelon/integration.UE/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py 2025-09-08 15:15:35.242987722 -0400 @@ -32,7 +32,7 @@ if DataVal == 0: Val = 'NULL' else: - Expr = '(char16_t*)(%s)' % Data + Expr = '(char16_t*)(%s)' % DataVal ValRef = valobj.CreateValueFromExpression('string', Expr) Val = ValRef.GetSummary() elif Type.IsReferenceType(): @@ -47,6 +47,11 @@ Expr = '(char16_t*)(%s)' % valobj.GetAddress() ValRef = valobj.CreateValueFromExpression('string', Expr) Val = ValRef.GetSummary() + else: + DataVal = valobj.GetValueAsUnsigned(0) + Expr = '(char16_t)(%s)' % DataVal + ValRef = valobj.CreateValueFromExpression('string', Expr) + Val = ValRef.GetSummary() return Val def UESignedCharSummaryProvider(valobj,dict): diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Plugins/Developer/VisualStudioCodeSourceCodeAccess/Source/VisualStudioCodeSourceCodeAccess/Private/VisualStudioCodeSourceCodeAccessor.cpp /home/jyelon/integration.UE/Engine/Plugins/Developer/VisualStudioCodeSourceCodeAccess/Source/VisualStudioCodeSourceCodeAccess/Private/VisualStudioCodeSourceCodeAccessor.cpp --- /home/jyelon/integration.UE.orig/Engine/Plugins/Developer/VisualStudioCodeSourceCodeAccess/Source/VisualStudioCodeSourceCodeAccess/Private/VisualStudioCodeSourceCodeAccessor.cpp 2025-03-11 10:33:14.000000000 -0400 +++ /home/jyelon/integration.UE/Engine/Plugins/Developer/VisualStudioCodeSourceCodeAccess/Source/VisualStudioCodeSourceCodeAccess/Private/VisualStudioCodeSourceCodeAccessor.cpp 2026-03-02 15:28:34.593675093 -0500 @@ -149,7 +149,7 @@ FString SolutionDir = GetSolutionPath(); TArray Args; Args.Add(MakePath(SolutionDir)); - Args.Add(TEXT("-g ") + MakePath(FullPath) + FString::Printf(TEXT(":%d:%d"), LineNumber, ColumnNumber)); + Args.Add(TEXT("-g ") + MakePath(FullPath + FString::Printf(TEXT(":%d:%d"), LineNumber, ColumnNumber))); return Launch(Args); } diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Source/Editor/UnrealEd/Private/SourceCodeNavigation.cpp /home/jyelon/integration.UE/Engine/Source/Editor/UnrealEd/Private/SourceCodeNavigation.cpp --- /home/jyelon/integration.UE.orig/Engine/Source/Editor/UnrealEd/Private/SourceCodeNavigation.cpp 2025-03-11 10:33:14.000000000 -0400 +++ /home/jyelon/integration.UE/Engine/Source/Editor/UnrealEd/Private/SourceCodeNavigation.cpp 2026-03-02 15:37:59.934459864 -0500 @@ -463,7 +463,7 @@ ISourceCodeAccessModule& SourceCodeAccessModule = FModuleManager::LoadModuleChecked("SourceCodeAccess"); ISourceCodeAccessor& SourceCodeAccessor = SourceCodeAccessModule.GetAccessor(); -#if PLATFORM_WINDOWS +#if PLATFORM_WINDOWS || PLATFORM_LINUX FString SourceFileName; uint32 SourceLineNumber = 1; uint32 SourceColumnNumber = 0; @@ -622,8 +622,8 @@ } UE_LOG(LogSelectionDetails, Warning, TEXT("NavigateToFunctionSource: Unable to look up symbol: %s in module:%s"), *FunctionSymbolName, *FunctionModuleName); - -#endif // PLATFORM_WINDOWS + +#endif // PLATFORM_WINDOWS || PLATFORM_LINUX } diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Source/Runtime/ApplicationCore/Private/Linux/LinuxPlatformApplicationMisc.cpp /home/jyelon/integration.UE/Engine/Source/Runtime/ApplicationCore/Private/Linux/LinuxPlatformApplicationMisc.cpp --- /home/jyelon/integration.UE.orig/Engine/Source/Runtime/ApplicationCore/Private/Linux/LinuxPlatformApplicationMisc.cpp 2025-03-11 10:33:14.000000000 -0400 +++ /home/jyelon/integration.UE/Engine/Source/Runtime/ApplicationCore/Private/Linux/LinuxPlatformApplicationMisc.cpp 2025-09-08 15:15:35.242987722 -0400 @@ -299,6 +299,9 @@ SDL_SetHint(SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE, "1"); // When relative mouse mode is active, don't hide cursor. SDL_SetHint(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "0"); // Don't warp the cursor to the center in relative mouse mode. + // Unreal does its own dynamic capturing, we don't need SDL to do it. + SDL_SetHint(SDL_HINT_MOUSE_AUTO_CAPTURE, "0"); + // If we're rendering offscreen, use the "dummy" SDL video driver if (FParse::Param(FCommandLine::Get(), TEXT("RenderOffScreen")) && !getenv("SDL_VIDEODRIVER")) { diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformStackWalk.cpp /home/jyelon/integration.UE/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformStackWalk.cpp --- /home/jyelon/integration.UE.orig/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformStackWalk.cpp 2025-03-11 10:33:14.000000000 -0400 +++ /home/jyelon/integration.UE/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformStackWalk.cpp 2026-03-02 15:37:24.464156072 -0500 @@ -15,6 +15,7 @@ #include "HAL/ExceptionHandling.h" #include "HAL/PlatformProcess.h" #include "HAL/PlatformTime.h" +#include "Modules/ModuleManager.h" #include "AutoRTFM/AutoRTFM.h" #include @@ -1060,3 +1061,69 @@ } ReportLock.Unlock(); } + +bool FUnixPlatformStackWalk::GetFunctionDefinitionLocation(const FString& FunctionSymbolName, const FString& FunctionModuleName, FString& OutPathname, uint32& OutLineNumber, uint32& OutColumnNumber) +{ + // Find the .so path for this module. + FString ModulePath; + TArray AllModules; + FModuleManager::Get().QueryModules(AllModules); + for (const FModuleStatus& Status : AllModules) + { + if (FPaths::GetBaseFilename(Status.FilePath) == FunctionModuleName) + { + ModulePath = Status.FilePath; + break; + } + } + if (ModulePath.IsEmpty()) + { + return false; + } + + // Debug symbols are in a separate .debug file alongside the .so. + FString DebugPath = FPaths::ChangeExtension(ModulePath, TEXT("debug")); + if (!FPaths::FileExists(DebugPath)) + { + return false; + } + + // Use lldb to look up the source file and line number. + // Run: lldb -b -o "image lookup -v -n ClassName::FuncName" + FString LldbParams = FString::Printf(TEXT("-b -o \"image lookup -v -n %s\" \"%s\""), *FunctionSymbolName, *DebugPath); + int32 ReturnCode = 0; + FString AllOutput; + FString Errors; + FPlatformProcess::ExecProcess(TEXT("/usr/bin/lldb"), *LldbParams, &ReturnCode, &AllOutput, &Errors); + if (ReturnCode != 0) + { + return false; + } + + // Parse the LineEntry from lldb verbose output. + // Format: "LineEntry: [0x...-0x...): /path/to/file.cpp:132" + TArray Lines; + AllOutput.ParseIntoArrayLines(Lines); + for (const FString& Line : Lines) + { + FString Trimmed = Line.TrimStartAndEnd(); + if (!Trimmed.StartsWith(TEXT("LineEntry:"))) + continue; + + int32 ParenIndex = Trimmed.Find(TEXT("): ")); + if (ParenIndex == INDEX_NONE) + continue; + FString FileAndLine = Trimmed.Mid(ParenIndex + 3); + + int32 ColonIndex; + if (!FileAndLine.FindLastChar(TCHAR(':'), ColonIndex)) + continue; + + OutPathname = FileAndLine.Left(ColonIndex); + OutLineNumber = FCString::Atoi(*FileAndLine.Mid(ColonIndex + 1)); + OutColumnNumber = 0; + return true; + } + + return false; +} diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Source/Runtime/Core/Public/Unix/UnixPlatformStackWalk.h /home/jyelon/integration.UE/Engine/Source/Runtime/Core/Public/Unix/UnixPlatformStackWalk.h --- /home/jyelon/integration.UE.orig/Engine/Source/Runtime/Core/Public/Unix/UnixPlatformStackWalk.h 2025-03-11 10:33:14.000000000 -0400 +++ /home/jyelon/integration.UE/Engine/Source/Runtime/Core/Public/Unix/UnixPlatformStackWalk.h 2026-03-02 15:36:22.690627000 -0500 @@ -24,6 +24,8 @@ static CORE_API void ThreadStackWalkAndDump(ANSICHAR* HumanReadableString, SIZE_T HumanReadableStringSize, int32 IgnoreCount, uint32 ThreadId); static CORE_API int32 GetProcessModuleCount(); static CORE_API int32 GetProcessModuleSignatures(FStackWalkModuleInfo *ModuleSignatures, const int32 ModuleSignaturesSize); + + static CORE_API bool GetFunctionDefinitionLocation(const FString& FunctionSymbolName, const FString& FunctionModuleName, FString& OutPathname, uint32& OutLineNumber, uint32& OutColumnNumber); }; typedef FUnixPlatformStackWalk FPlatformStackWalk;