π©Ί GeneralUpdate Troubleshooting
Comprehensive diagnostic system covering 50+ known issues, all traceable to GitHub/Gitee Issues or code audit findings.
π User Symptom Collectionβ
### Required Information
- Symptom description: ______
- Error message/stack trace: ______
- GeneralUpdate version: ______
- Platform: ______ (Windows / Linux / macOS)
- .NET version: ______
- Update strategy: ______ (Standard / OSS / Silent / Differential / CVP / Push)
- Recent config changes: ______ (Yes/No, what changed)
### Optional Information
- Any ExceptionEventArgs in event listeners: ______
- Any logs (Logs/generalupdate-trace-*.log): ______
- Issue reproducible: ______ (Yes/No, frequency)
- First occurrence: ______
Workflowβ
1. Symptom Collection
βββ What is the user's symptom?
βββ Error message/stack trace?
βββ GeneralUpdate version?
βββ Platform (Windows/Linux/macOS)?
βββ Update strategy (Standard/OSS/Silent)?
2. Symptom Matching
βββ Priority: python3 scripts/search.py "<symptom>" --domain issue
β βββ Matched β Provide root cause + fix + code
βββ No match β Fall back to reference.md full text search
3. Provide Fix
βββ Specific code changes, config adjustments, version upgrade suggestions
βββ Preventive measures
4. Verify
βββ Confirm the fix resolves the issue
Symptom Search (Recommended)β
Prefer using the BM25 search engine for precise matching of known issues:
# Natural language search for known issues
python3 .claude/skills/generalupdate-troubleshoot/scripts/search.py "update succeeded but app crashes" --domain issue
python3 .claude/skills/generalupdate-troubleshoot/scripts/search.py "method not found" --domain issue
python3 .claude/skills/generalupdate-troubleshoot/scripts/search.py "garbled Chinese text" --domain issue
# Search for strategy-related issues
python3 .claude/skills/generalupdate-troubleshoot/scripts/search.py "OSS permission error" --domain strategy
Symptom Severity Levelsβ
| Level | Color | Meaning | Count |
|---|---|---|---|
| C | π΄ Critical | Blocking failure, data corruption, security vulnerability | 8 |
| H | π High | Scenario blocking, feature failure, upgrade needed | 11 |
| M | π‘ Medium | Functionality degraded, configuration adjustment needed | 20 |
| L | π΅ Low | Code smell, edge cases, known behavior | 12 |
Full list available in reference.md
β Universal Pre-Diagnosis Checklistβ
Runtime Environment Checkβ
- Target machine has correct .NET runtime installed (matches publish framework)
- Target machine has write permissions (InstallPath directory writable)
- Firewall not blocking UpdateUrl communication port
- Sufficient disk space (at least 2Γ update package size)
- Linux/macOS: UpgradeApp has
chmod +xexecutable permissions
Version Checkβ
- Client and Upgrade projects use the exact same NuGet version
- Server returns version numbers in 4-part format (e.g. 1.0.0.0)
- manifest.json
mainAppNamematches actual process name -
AppTypeset correctly (Client = 1, Upgrade = 2)
Configuration Checkβ
- All 6 required
UpdateRequestfields are set -
UpdateUrlaccessible via HTTP GET returning valid JSON -
AppSecretKeymatches server config (length β₯ 16 characters) - UpgradeApp.exe exists in
update/subdirectory of publish directory
Log Checkβ
- Check
Logs/generalupdate-trace-*.log(if available) - Check
ExceptionEventArgsin event listeners - Check
MultiDownloadErrorEventArgsfor exceptions
C Level (Critical) β Blocks Updatesβ
| Issue | Cause | Solution |
|---|---|---|
| Update not starting | LaunchAsync() not called / UpgradeApp.exe not deployed | Ensure Bootstrap.LaunchAsync() is called in Main() |
| Method not found | Client and Upgrade NuGet versions differ | Unify NuGet versions, clean bin/obj and rebuild |
| Path too long (>260) | Windows path limit | Shorten install path |
| IPC exposure | IPC encryption key hardcoded | Use strong AppSecretKey; upgrade to v10.4.6+ |
| Cross-tenant leakage | Missing server multi-tenant isolation | Independent ProductId + AppSecretKey per tenant |
| ZIP traversal write | Malicious ZIP with ../ paths | v10.4.6+ already fixed |
| BSDIFF integer overflow | Large file diff calculation overflow | Use HDiffPatch algorithm |
| Silent mode not working | Process exit not triggered | Ensure Close() or Dispose() is called correctly |
H Level (High) β Severe but Non-Blockingβ
| Issue | Cause | Solution |
|---|---|---|
| Infinite update loop | manifest.json version not updated | Upgrade to v10.4.6+ (WriteBack fixed) |
| OSS no update found | Bucket config wrong / incorrect versions.json | curl test OSS URL |
| File in use | Target file locked | Close main process before update |
| SignalR push not responding | Connection dropped or auth failure | Check SignalR Hub status and Token config |
| Bowl not monitoring | Process name misconfigured | Verify ProcessNameOrId matches actual process |
M Level (Medium) β Functionality Degradedβ
| Issue | Cause | Solution |
|---|---|---|
| AOT build failure | Reflection not adapted for NativeAOT | Add [DynamicDependency] attributes |
| SignalR reconnection slow | RetryDelay too long | Adjust retry parameters |
| Logs not outputting | Log path permission issue | Check %TEMP%/GeneralUpdate/logs/ permissions |
| Multi-tenant config wrong | ProductId collision | Ensure unique ProductId per tenant |
L Level (Low) β Non-Criticalβ
| Issue | Cause | Solution |
|---|---|---|
| Package too large | Differential not enabled | Differential is embedded in Core, enable PatchEnabled |
| First update slow | CDN cold start | Warm up CDN |
| Config lost after update | Blacklist doesn't include config dir | Ensure Directories includes config folder |
6-Step Universal Diagnosticβ
When the issue can't be directly matched, follow these 6 steps:
- Version consistency check β Are Client and Upgrade NuGet versions the same?
- manifest.json verification β Does the file exist? Are fields correct?
- UpgradeApp existence β Is UpgradeApp.exe in the expected directory?
- Network accessibility β Can you curl the UpdateUrl?
- Log analysis β Check logs in
Logs/generalupdate-trace-*.log - Minimal reproduction β Start with Minimal integration, gradually add complexity
Log File Locationsβ
| Platform | Default Path |
|---|---|
| Windows | %TEMP%/GeneralUpdate/logs/ |
| Linux | /tmp/GeneralUpdate/logs/ |
Security Notesβ
- AppSecretKey management β hardcoding in the client is a last resort; prefer startup arguments or environment variables
- Rotate IPC encryption keys regularly
- Disable debug logging in production
β οΈ Anti-Pattern Checklistβ
| # | Anti-Pattern | Consequence | Correct Approach |
|---|---|---|---|
| 1 | Only looking at error messages, not events | Missing detailed info in ExceptionEventArgs | Subscribe to all 7 events |
| 2 | Assuming no logs because wrong path | Missing critical diagnostic info | Check InstallPath/Logs directory |
| 3 | Only checking Client, not Upgrade process | Issue is in Upgrade but diagnosis goes wrong | Check both processes |
| 4 | Modifying code for update issues immediately | Issue might be server config, not client bug | Check server version info first |
| 5 | Ignoring NuGet version consistency | "Method not found" root cause is version mismatch | Check versions first |
| 6 | Testing only in Debug environment | Release may lack runtime files | Reproduce in release/production environment |
Related Skillsβ
/generalupdate-initβ Bootstrap configuration/generalupdate-uiβ Update UI diagnostics/generalupdate-strategyβ Strategy-related issues/generalupdate-advancedβ Advanced feature issues