Garmin Edge: Connect-IQ-Datenfeld stürzt mit „Unexpected Type Error – Failed invoking <symbol>“ ab
Zwei eigene Datenfelder liefen auf meinem Edge 1050 problemlos, bis der Edge einmal abstürzte. Danach brach immer das zweite Feld beim Anmelden für Handy-Nachrichten ab, und die Felder meldeten „Handy nicht erreichbar“. Mit Protokolldateien direkt auf dem Gerät ließ es sich eingrenzen. Geholfen haben eine saubere Neuinstallation und ein Neustart von Garmin Connect.
$ git log --graph Der Weg zur Lösung
-
Problem
IQ! nach dem Absturz
Nach einem Absturz des Edge bricht ein Datenfeld mit „Failed invoking “ in der Anmeldezeile für Handy-Nachrichten ab.
-
Irrweg
try/catch und Verschieben
Der Fehler wanderte nur ins andere Feld und ließ sich nicht abfangen.
-
Irrweg
err_log.txt gedeutet
Die Einträge stammten vom Anstecken per USB, nicht vom Absturz.
-
Erkenntnis
Eigene Protokolle
println-Dateien zeigen: Das zweite Feld scheitert bei der Anmeldung, der Speicher ist unauffällig.
-
Irrweg
Kopien aus Apps\Media
Der Edge lehnte sie mit „Signature check failed“ ab.
-
Lösung
Sauber neu installieren
Original-Builds neu aufgespielt und Garmin Connect neu gestartet: Die Anmeldung klappt, die Werte kommen an.
Umgebung: Garmin Edge 1050 (Firmware 33.17, Connect IQ 6.0.4), zwei selbst geschriebene Datenfelder, die per Communications.registerForPhoneAppMessages Werte von einer Android-App bekommen (Garmin Connect 5.30.1). Beide Felder liefen stundenlang gleichzeitig. Nach einem Absturz des Edge zeigte eines der Felder nur noch das IQ!-Symbol, das andere „Handy nicht erreichbar“.
Das Problem
In Garmin\Apps\LOGS\CIQ_LOG.BAK stand:
Error: Unexpected Type Error
Details: 'Failed invoking <symbol>'
Stack:
- File: '...\FeldApp.mc'
Line: 35
Function: getInitialView
Zeile 35 war Communications.registerForPhoneAppMessages(...). Nachdem ich die Anmeldung in compute() verschoben hatte, stürzte dasselbe im anderen Feld ab, wieder in der Anmeldezeile. Ein try/catch half nicht: Dieser Fehler beendet das Feld sofort.
Eingrenzen: Protokoll direkt auf dem Gerät
System.println landet auf dem Edge in einer Textdatei, aber nur, wenn sie existiert. Also legt man per USB eine leere Datei mit dem Namen der PRG-Datei an:
Garmin\Apps\LOGS\APPNAME.TXT
function dbg(t as String) as Void {
var s = System.getSystemStats();
System.println(_secs + " " + t + " mem=" + s.usedMemory + "/" + s.totalMemory);
}
// ...
dbg("registriere");
Communications.registerForPhoneAppMessages(method(:onPhone));
dbg("registriert");
Das Ergebnis nach dem nächsten Absturz:
ENERGIE.TXT: 1 registriere mem=11168/127592
1 registriert mem=11288/127592
FELD.TXT: 1 registriere mem=13656/127592 <- danach Absturz
Damit war klar: kein Speicherproblem (rund 10 % belegt), keine Nachricht vom Handy beteiligt. Das zweite Feld scheiterte schon an der Anmeldung.
Die Lösung
- Beide Datenfelder sauber entfernen. Der Edge verschiebt aufgespielte PRG-Dateien nach der Installation von
Garmin\AppsnachGarmin\Apps\Media. Dort entfernen oder auf dem Gerät deinstallieren, dann den Edge neu starten. - Die Original-Builds neu aufspielen, nicht die Kopien aus
Media. Die verändert der Edge bei der Installation. Spielt man sie zurück, lehnt er sie ab, ohne etwas anzuzeigen. Im Protokoll steht dann nur'Signature check failed on file: ...'. - Garmin Connect auf dem Handy beenden und neu öffnen. Obwohl Bluetooth verbunden war, meldete das Mobile SDK der Begleit-App das Gerät als
NOT_CONNECTED, Nachrichten scheiterten mitFAILURE_DURING_TRANSFER, und die Felder zeigten „Handy nicht erreichbar“. Nach dem Neustart von Garmin Connect lief der Austausch sofort.
Danach meldeten sich die Felder wieder an, und die Werte kamen an.
Warum das funktioniert
Die genaue Ursache kenne ich nicht. Am Code der Anmeldung hatte sich nichts geändert, die Garmin-Apps auf dem Handy und die Firmware des Edge auch nicht. Am ehesten ist beim Absturz des Edge ein Zustand hängen geblieben, auf dem Edge und in Garmin Connect, der einen normalen Neustart des Edge übersteht. Meine erste Vermutung, dass sich grundsätzlich nur ein Feld anmelden darf, war falsch: Nach der Neuinstallation meldeten sich beide an.
Stolperfallen
Garmin\Debug\err_log.txtbekommt bei jedem Anstecken per USB neue Einträge (Bluetooth, Energieverwaltung, ANT). Die haben mit dem eigentlichen Absturz nichts zu tun. Auf die Uhrzeit achten.CIQ_LOGhielt nicht jeden Absturz fest. Eigene Protokollzeilen waren aussagekräftiger.FAILURE_DURING_TRANSFERbedeutet oft nur, dass das Datenfeld gerade nicht läuft. Datenfelder laufen nur bei geöffnetem Aktivitätsprofil, nicht auf dem Startbildschirm.- Werte selbst aufgespielter Apps stehen zwar in der FIT-Datei, Garmin Connect zeigte sie bei mir aber nicht an, anders als die Werte aus Garmins Radar-Funktion.