Skip to content

Doppelvoice v0.3.3 — defense-in-depth crash hardening

Latest

Choose a tag to compare

@Tianqi-Bu Tianqi-Bu released this 26 Apr 17:01

Summary

Defense-in-depth follow-up to v0.3.2's hotfix. v0.3.2 fixed the specific
logger.add(None, ...) crash, but a static sweep found another identical-shape
vulnerability in cli.py, and the bundle still had no last-resort handler for
any unhandled exception escaping main(). v0.3.3 plugs both holes so a future
regression of the same family ("stdio is None in windowed bundle") still leaves
the user with a friendly Qt dialog and a crash log on disk — never the opaque
PyInstaller "Unhandled exception in script" box again.

No functional changes for users on v0.3.2 who never hit a crash — this is
purely belt-and-suspenders.

Fixed

  • cli.py main(): configuration-error fallback print(file=sys.stderr) was
    vulnerable to the same sys.stderr is None failure that took out
    v0.3.0/v0.3.1. A user with a malformed/missing .env would have triggered it.

Added

  • __main__.py: installed sys.excepthook = _last_resort_handle. Any uncaught
    exception now (1) writes a timestamped traceback to
    %APPDATA%\Doppelvoice\logs\crash.log and (2) shows a Qt
    QMessageBox.critical with the trace tail and the log path. Falls back
    gracefully if Qt itself is unavailable.

Verified

End-to-end smoke from a fresh extraction directory (not the project root):

  • GUI double-click → launches clean, no crash.log produced
  • Doppelvoice.exe --help → 9-language description string
  • Doppelvoice.exe --check (no .env) → exit 2 + Chinese friendly error

Download

Doppelvoice-v0.3.3-win64.zip (60.5 MB)
SHA256: 7D259E46ACC0D4E3B4E57A3630B4F3D4E94F0B1CB3CFF7CA21E0A5A55FEFE193

Unzip, double-click Doppelvoice.exe, paste your Doubao AppID + AccessToken
into the Settings dialog. No .env editing required.