-
Notifications
You must be signed in to change notification settings - Fork 2
Troubleshooting
Common issues and solutions for Quest UE4 Modloader.
Always start by collecting logs:
# Modloader log
python tools/deploy.py log
# Crash dumps (tombstones)
python tools/deploy.py tombstones
# Android logcat (verbose)
adb logcat | grep -i "modloader\|UEMod\|lua"Symptoms: No UEModLoader.log on device, game runs normally without mods.
Causes & Solutions:
-
Library not injected — Verify
libmodloader.sois in the correct path -
Wrong architecture — Must be ARM64 (
file libmodloader.soshould showaarch64) -
Permissions —
chmod 755 /path/to/libmodloader.so - Root required — Modloader injection requires root access on Quest
Symptoms: Game immediately closes or shows a black screen.
Solutions:
- Pull tombstones:
python tools/deploy.py tombstones - Check for symbol resolution failures in the log
- Try removing all mods and testing with just the modloader
- Verify NDK version matches (r23c / 23.1.7779620)
Symptoms: Log shows modloader init but mod isn't listed.
Check:
- Folder structure:
mods/ModName/main.lua(case-sensitive!) - Lua syntax errors: check the log for
[LuaError]messages - File encoding: must be UTF-8 (no BOM)
- Mod name conflicts: each folder must have a unique name
Symptoms: RegisterPreHook/RegisterPostHook succeeds but callback never runs.
Check:
-
Path is correct — Use full UFunction path:
/Script/Module.Class:Function- Blueprint:
/Game/Blueprints/Path/BP.BP_C:FunctionName - Native:
/Script/ModuleName.ClassName:FunctionName
- Blueprint:
- Function actually called — Not all functions run during gameplay
- Typos — Path is case-sensitive
-
PE trace — Enable ProcessEvent tracing to see what functions fire:
python tools/deploy.py console > exec_lua SetPETraceEnabled(true)
Symptoms: pcall(function() obj:Get("Prop") end) returns false with a generic error.
Solutions:
- Check
obj:IsValid()before the pcall - Verify property name exists in the SDK dump
- Try
obj:GetClassName()to confirm the object type - Use the bridge to test interactively:
exec_lua local o = FindFirstOf("ClassName"); return o:Get("PropName")
Symptoms: Objects that were valid become invalid.
Causes:
- UObject was garbage collected
- Level was unloaded
- Object was destroyed by game logic
Solution: Always re-find objects or check IsValid():
-- Don't cache forever
local function get_player()
local p = FindFirstOf("PlayerController")
return (p and p:IsValid()) and p or nil
endSymptoms: python tools/deploy.py console fails to connect.
Solutions:
- Set up port forwarding:
python tools/deploy.py forward - Or manually:
adb forward tcp:19420 tcp:19420 - Verify game is running with modloader loaded
- Check if bridge is enabled in modloader config
Symptoms: build.bat or build.sh fails.
Check:
- NDK path is correct and NDK r23c is installed
- CMake 3.22+ is available
- Ninja is installed
- Submodules are cloned:
git submodule update --init --recursive - On Windows, ensure NDK path has no spaces
Symptoms: Game crashes after RegisterNativeHook.
Causes:
- Wrong signature string (arg count mismatch)
- Symbol doesn't exist (stripped)
- Function is too short for Dobby to hook (< 16 bytes)
Solutions:
- Verify symbol exists:
exec_lua return ToHex(FindSymbol("_ZSymbol")) - Double-check signature matches the actual C++ signature
- Use pattern scan as fallback:
FindPattern("FF 43 00 D1 ...") - The modloader has crash guards — check the log for
[CrashHandler]
- Reduce
LoopAsyncfrequency (use longer intervals) - Avoid heavy operations in hooks that fire every frame
- Use
LoopInGameThreadinstead ofLoopAsyncfor game modifications - Profile with PE trace to find hotspots
- Cache results and re-find only when needed
- Use
NotifyOnNewObjectinstead of polling
- Search existing issues on GitHub Issues
- Open a bug report using the template
-
Include logs — always attach
UEModLoader.logand any tombstones - Minimal reproduction — try to isolate which mod/hook causes the issue