Skip to content

[macOS] Unity 2022.3.61f1c1 + LuaPanda 调试器开始调试导致Unity崩溃:lua_getinfo 空指针访问 (EXC_BAD_ACCESS) #207

@IRuemoI

Description

@IRuemoI

Describe the bug

macOS 26.2 (25C56) 上使用 Unity 2022.3.61f1c1 (Apple Silicon/ARM64) 配合 LuaPanda 调试器 时,进入 Play 模式会触发 确定性崩溃。崩溃发生在 Lua 调试器的 lua_getinfo 函数中,表现为空指针访问 (EXC_BAD_ACCESS at 0x0000000000000004)。

崩溃堆栈显示问题位于 libpdebug.so(LuaPanda 提供的 C 调试钩子库)与 libxlua.dylib(xLua)的交互过程中,具体是在 Lua 调试钩子回调期间调用 lua_getinfo 时访问了无效内存地址。

To Reproduce

Steps to reproduce the behavior:

  1. 环境准备:macOS 26.2 (25C56) + Unity 2022.3.61f1c1 (Apple Silicon) + VS Code 1.109.3 (Universal)
  2. 在 VS Code 中安装 LuaPanda 扩展,配置 launch.json保持默认设置(即 useCHook: true 或未显式设置)
  3. 在 Unity 中打开使用 xLua 的项目
  4. 在 VS Code 中启动 LuaPanda 调试会话(Attach 模式,端口 8818)
  5. 在 Unity 编辑器中点击 Play 按钮进入 Play 模式
  6. 观察到 Unity 立即崩溃,崩溃报告生成

Expected behavior

LuaPanda 调试器应正常工作,允许在 Unity Play 模式下进行 Lua 代码的断点调试,不应导致编辑器崩溃。

Screenshots

崩溃堆栈关键部分:

Exception Type:    EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000004

Thread 0 Crashed:: tid_103 Dispatch queue: com.apple.main-thread
0   libpdebug.so                  	       0x165ad00f8 lua_getinfo + 128
1   libpdebug.so                  	       0x165abfe6c debug_hook_c(lua_State*, lua_Debug*) + 156
2   libxlua.dylib                 	       0x176f8024c luaD_hook + 216
3   libxlua.dylib                 	       0x176f80320 luaD_poscall + 76
4   libxlua.dylib                 	       0x176f80790 luaD_precall + 752
5   libxlua.dylib                 	       0x176f9976c luaV_execute + 788
6   libxlua.dylib                 	       0x176f80af0 luaD_callnoyield + 88
...
22  Unity                         	       0x100e17fec MonoBehaviour::CallAwake() + 296
...
32  Unity                         	       0x101d6d83c EditorSceneManager::RestoreSceneBackups(...) + 2508
33  Unity                         	       0x101a2be6c PlayerLoopController::EnterPlayMode() + 520

Desktop (please complete the following information):

  • OS: macOS 26.2 (25C56) - Apple Silicon (ARM64)
  • Visual Studio Code Version: 1.109.3 (Universal)
  • LuaPanda Version: 最新版(VS Code Marketplace 安装)
  • Framework: xLua 2026.2.14通过github下载源码导入asset和tool两个文件夹
  • Other information:
    • 调试库:libpdebug.so(LuaPanda C 钩子库,位于 /Users/USER/*/libpdebug.so
    • xLua 库:libxlua.dylib(位于 /Users/USER/*/libxlua.dylib
    • 崩溃 100% 复现,与具体 Lua 脚本内容无关

Additional context

已验证的解决方案:

在 VS Code 的 launch.json显式禁用 C 钩子可避免崩溃:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lua",
            "request": "attach",
            "name": "LuaPanda",
            "connectionPort": 8818,
            "useCHook": false,      // ← 关键:禁用 C 钩子后崩溃消失
            "stopOnEntry": false
        }
    ]
}

技术根因分析:

  • useCHook: true(默认)时,LuaPanda 使用 C 层钩子(debug.sethook 的 C 函数指针)实现高性能调试
  • 崩溃发生在 Unity 进入 Play 模式、恢复场景备份并调用 MonoBehaviour.Awake() 期间
  • 此时 Lua 虚拟机正在执行脚本,调试钩子 debug_hook_c 被触发,但 lua_getinfo 接收到的 lua_Statelua_Debug 结构体包含无效指针(偏移 4 字节处访问失败)
  • 可能与 Unity 2022.3.61f1c1 的 Mono 运行时或 xLua 的 Lua 状态管理机制在 Apple Silicon 上存在兼容性问题

相关参考:

建议: 在 xLua 文档中注明该兼容性问题,建议 macOS + Unity 2022.3 用户临时禁用 useCHook

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions