What is 0010
ALLS system error 0010: unexpected game program failure — this is the error that pops up when SEGA’s ALLS boot process mxsegaboot detects that the main game program mai2.exe has terminated abnormally. The only fix SEGA offers is to shut down and restart the game’s main program. This article will go deep into this subject and explain it in detail
The error system
Maimai cabinets have two error systems
| Layer | Display | Typical error codes |
|---|---|---|
| Boot layer | mxsegaboot | 0001/0010 |
| Game layer | Game program | 0912/3100 |
Trigger mechanism
In one sentence: the game process died without going through the normal Core.Kill channel
From decompilation we can see that ALLS designed three legitimate exit paths:
| Exit reason | Game call | Boot layer reaction |
|---|---|---|
| Restart | Core.Kill (restart) | Normal exit |
| System error / entering test | Core.Kill (system error / test) | Normal exit |
| Abnormal exit | Crash | 0010 |
The boot layer’s two detection channels
mxsegaboot identifies abnormal exits through two independent channels:
-
Abnormal exit code: when the game process exits, the boot layer reads its exit code. Only a few specific values count as a “normal exit” (the legitimate values corresponding to Core.Kill); everything else is judged abnormal
-
Process crash flag: the mxmaster framework records whether the game process has ever crashed (fault). The boot layer queries this flag at startup and judges an abnormal exit if it is non-zero
Both ultimately result in rendering the 0010 error page
How the game triggers it
Main thread exception path
GameMain.Update() / LateUpdate() └─ try/catch → ExceptionHandler() ├─ 写崩溃日志(.log + .png,保留最近 4 份) ├─ 截图 └─ 设 GameManager.IsException = true
GameMainObject.Update() └─ if (GameManager.IsException) ├─ isQuit = true └─ Application.Quit() ## 没有 Core.Kill!→ 触发 0010The key point is that the IsException branch calls only Application.Quit(), without Core.Kill(), while the other three exit branches (restart / system error / entering test) all have Core.Kill. This is the direct reason why a game exception exit leads the boot layer to judge it abnormal
Background threads
If a background thread (such as data loading, touch input, serial communication, etc.) has an uncaught exception, the CLR will terminate the process directly, bypassing the IsException path, and this also triggers 0010. Crashes of this kind leave no .log in the crash log, making diagnosis harder
Resource IDs pointing to nonexistent resources
The most common case, which is what we usually call illegal dirty data in the account
When the game’s resource manager (DataManager.cs) can’t find a matching ID, almost all of them return null; only the Chara-related getters return a defensive empty object:
| Getter | Return value on miss |
|---|---|
GetChara / GetCharaAwake | new CharaData() |
GetPartner | null |
GetMusic | null |
GetMapData | null |
GetIcon / GetPlate / GetTitle / GetFrame | null |
GetLoginBonus / GetTicket / GetEvent / all the rest | null |
Any GetXxx(illegalID).field accessed without a null check produces a NullReferenceException → triggers 0010
CheckDisableCollection in UserData.cs (which automatically resets illegal collection items at login) only covers some of the fields:
| Field | Defense | Risk |
|---|---|---|
| EquipIconID / EquipPlateID / EquipFrameID / EquipTitleID | Reset to the default value | Low |
| EquipPartnerID | ❌ None | High |
| SelectMapID | ❌ None (some screens have a FindIndex fallback, but it’s not comprehensive) | High |
Known crash list
The following scenarios have been tested in practice plus code analysis; when an account holds an illegal ID, they will definitely crash:
| No. | Resource involved | Trigger scenario | Crash type |
|---|---|---|---|
| R1 | Partner | Setting after login / building the dress-up screen | NullReferenceException |
| R2 | Partner | Results screen | NullReferenceException |
| R3 | Partner | Friend versus results | NullReferenceException |
| R4 | Partner | Login bonus | NullReferenceException |
| R5 | Music | Rival | NullReferenceException |
| R6 | Music | Song selection | NullReferenceException |
| R7 | Music | Results / album / card reading / song selection and other flows | NullReferenceException |
| R8 | Map | map / chara and other data processing, 20+ places | NullReferenceException |
| R9 | Map | Map data sync | IndexOutOfRangeException |
R8 is the most typical disaster zone
Trigger process
账号存档中含有客户端不存在的资源 ID(已下架 / 未更新的超前数据 / 脏数据) ↓对应画面调用 GetXxx(id) 返回 null ↓未判空直接访问字段 → NullReferenceException ↓ExceptionHandler 记录崩溃日志 ↓GameManager.IsException = true ↓GameMainObject.Update 检测到 → Application.Quit() ↓引导层判定进程非正常退出 → 弹出 0010How to fix it
| Symptom | What to check | Action |
|---|---|---|
| Crashes with a fixed account | Resource-related (most common) | Fix the dirty data in the account / avoid logging into this account |
| Fixed song / fixed action, crashes even with another account | Corrupted game files | Re-download |
| Completely random, any account can trigger it | Hardware-related (SSD / RAM / power) | Check the hardware |
| Crashes immediately on boot, can’t get into the game | Possibly underlying damage | Ask customer service |
