2015-08-06 16 views
10

Bei der Ausführung meiner asmjs \ emscripten-Anwendung, kompiliert von C++, hat es plötzlich begonnen zu protokollieren: "run() called, but dependencies remain, so not running" an die Webkonsole, und nichts mehr passiert. Ich habe einige couts am absoluten Start meiner Haupt hinzugefügt, aber auch sie werden nicht erreicht.Emscripten-Anwendung wird nicht ausgeführt

Die Anwendung erfolgreich zuvor ausgeführt, aber plötzlich begann dies zu geschehen und ich weiß nicht, welche Änderung dies ausgelöst hat.

Kann jemand dieses debuggen?

aktualisieren

Nach so viel Quellcode entfernen, wie ich konnte, dies so schnell geschieht, wie ich # include, auch durch meine Haupt besteht einfach aus einem einzigen cout.

Antwort

1

Ich denke, Sie haben nicht genug Informationen gegeben, um wirklich sicher zu wissen. Aber es könnte zum Beispiel sein, dass Ihre js plötzlich einen Speicherschwellenwert überschritten hat, der über das hinausgeht, was der Browser ihm zuweisen möchte. Sie könnten versuchen, die Menge an verwendetem Speicher zu reduzieren/einige Assets zu streamen anstatt sie vorher zu laden/weniger Code zu versenden/-Os-Optimierungslevel zu verwenden?

6

Idealerweise haben Sie die gesamte Umgebung, wenn sie in der Versionskontrolle ausgeführt wurde, und bauen seitdem jede Version auf, um zu sehen, wo sie zerbrochen ist.

Sie könnten Ihren Code in der Versionskontrolle haben, aber vielleicht nicht selbst Emscripten. Wenn Sie Emscripten aktualisiert haben, könnte dies zu Verhaltensunterschieden führen. Ich würde versuchen, zu der Version zurückzukehren, die du benutzt hast, als sie lief. Beachten Sie, dass manchmal verschiedene Cache-Verzeichnisse eine Emscript-Versionsänderung überstehen und möglicherweise manuell gelöscht werden müssen (ich habe das genau vergessen). Die restlichen Abhängigkeiten können bedeuten, dass Sie versuchen, etwas zu tun, bevor Emscripten noch andere Dateien geladen hat, z. B. Dateien, die von --preload-file oder --memory-init-file angefordert wurden. Beachten Sie, dass Sie laut https://kripken.github.io/emscripten-site/docs/getting_started/FAQ.html#faq-when-safe-to-call-compiled-functions nicht versuchen sollten, Emscript-Funktionen auszuführen, bis die C++ main-Funktion ausgeführt worden ist. Um dies zu erkennen, können Sie beispielsweise Ihre eigene Javascript-Funktion von main aufrufen (es gibt andere Möglichkeiten).

Die Tatsache, dass dies zuvor kein Problem verursacht hat, könnte etwas sein, das nicht zusammenhängt: eine Änderung oder Aktualisierung im Webbrowser, Änderung der Grenzen von gleichzeitigen Downloads oder eine Änderung des Webservers, von dem diese ausgeführt wird. Sie können auf der Registerkarte "Netzwerk" im Browser nachsehen, ob Ihnen etwas als anders oder verdächtig erscheint.

Wie Haupt noch nicht einmal erreicht ist, dann ist es vielleicht nicht so. Ich würde versuchen, praktisch deinen gesamten Code auszukommentieren und es so zu machen, dass du praktisch nichts als ein Hallo-Welt-Programm hast. Vielleicht haben Sie keine korrekte Einstellung im Module-Objekt, oder die Anforderung für die Speicherinitialisierungsdatei ist nicht erfolgreich (Sie können dafür die Registerkarte Netzwerk im Browser einchecken). Wenn Ihr basic hallo world-Programm immer noch nicht funktioniert, können Sie es mit seinem Code in einer separaten Frage erneut posten.

+0

Ich habe getan, was Sie gesagt haben, und wie es scheint, genügt es, einfach sdl.h von einem fast leeren Projekt zu verwenden, um dies zu verursachen. –

+0

@ViktorSehr Ich würde die Details als eine separate Frage, mit dem Code + Befehlszeile, die Sie zum Kompilieren verwenden. (Ihre ursprüngliche Frage lautet: "Wie finde ich, was das Problem ist", aber jetzt ist es "Wie behebe ich dieses Problem?") –

+1

"einfach sdl.h von einem fast leeren Projekt zu verwenden ist genug, um dies zu verursachen" Ich denke Sie Sie sollten zum em_sdk-Tool wechseln und Ihren emscripten-Compiler auf den neuesten Master-Zweig aktualisieren und außerdem die Funktion "Cache löschen" verwenden, um sicherzustellen, dass die zwischengespeicherte SDL-Version aus der Quelle wiederhergestellt wird. Wenn Sie tatsächlich ein Problem mit dem (emscripten mitgelieferten) SDL-Paket haben, das ist ein Fehler, den Sie alon melden können Ich denke, –

3

Dies kann auch passieren, wenn der Browser nicht mehr genügend Arbeitsspeicher hat. Leider ist die Speicherverwaltung des Browsers nicht in unserer Kontrolle, so dass Sie nicht viel mehr tun können, als Ihre Payload zu reduzieren. Dazu gehören die Größe des Codes, die Größe des Inhalts vor dem Laden usw. Grundsätzlich hilft alles, was den Gesamtspeicherverbrauch Ihres Programms verringern kann, dies zu beheben. Browser-Anbieter arbeiten ständig daran, dies zu verbessern, aber es wird noch eine Weile dauern.

+0

Ich empfehle Bearbeitung "das passiert wenn" -> "dies kann auch passieren wenn ". Denn das geschah nicht wegen der Erinnerung, sondern wegen des in Michal Charemzas Antwort erwähnten Grundes. –

Verwandte Themen