2015-08-06 23 views
10

Podczas uruchamiania mojej aplikacji asmjs \ emscripten skompilowanej z C++, nagle zaczęło się rejestrować: "run() called, but dependencies remain, so not running" do konsoli internetowej i nic więcej się nie dzieje. Dodałem niektóre cout's na absolutnym początku mojej głównej, ale nawet one nie zostały osiągnięte.Aplikacja Emscripten nie wykonuje

Aplikacja została pomyślnie wykonana wcześniej, ale nagle zaczęło się to dziać i nie wiem, jaka zmiana spowodowała to.

Czy ktoś wie, jak to debugować?

Aktualizacja

Po usunięciu tyle kodu źródłowego, jak tylko mogłem, to dzieje się tak szybko, jak #include, nawet z powodu mój główny po prostu składa się z pojedynczego cout.

Odpowiedz

1

Myślę, że nie podałeś wystarczająco dużo informacji, aby wiedzieć na pewno. Ale może być na przykład, że twój js nagle przekroczył pewien próg pamięci, który przekracza to, co przeglądarka chce przeznaczyć na to. Możesz spróbować zmniejszyć ilość wykorzystanej pamięci/strumieniowania niektórych zasobów, zamiast wstępnie je ładować/wysłać mniej kodu/użyć -O optymalizacji poziomu?

6

Idealnie byłoby mieć całe środowisko, gdy był uruchomiony w kontroli wersji, i budować każdą wersję od tego momentu, aby zobaczyć, gdzie się zepsuł.

Może masz swój kod w kontroli wersji, ale być może nie sam Emscripten. Jeśli zaktualizowałeś Emscripten, może to prowadzić do różnic w zachowaniu. Chciałbym spróbować wrócić do jakiejkolwiek wersji, która była używana podczas pracy. Zauważ, że czasami różne katalogi cache przetrwają zmianę wersji Emscripten i mogą wymagać wyczyszczenia ręcznie (zapomniałem dokładnie).

Zależności pozostałe mogą oznaczać, że próbujesz coś zrobić, zanim program Emscripten załaduje wszystkie inne pliki, których potrzebuje, np. Pliki wymagane przez --preload-file lub --memory-init-file. Zauważ, że zgodnie z https://kripken.github.io/emscripten-site/docs/getting_started/FAQ.html#faq-when-safe-to-call-compiled-functions nie powinieneś uruchamiać żadnych funkcji Emscripten, dopóki nie zostanie uruchomiona funkcja C++ main. Aby to wykryć, możesz na przykład wywołać własną funkcję JavaScript od main (są inne sposoby).

Fakt, że nie był to problem, mógł być czymś, co wydaje się zupełnie niezwiązane ze sobą: zmiana lub aktualizacja w przeglądarce internetowej, zmiana limitów jednoczesnych pobrań lub zmiana w serwerze sieciowym, z którego jest uruchomiony. Możesz spojrzeć na zakładkę Sieć w przeglądarce, aby sprawdzić, czy coś wyskoczy na ciebie jako coś innego lub podejrzanego.

Jednak, jako główny nie jest jeszcze osiągnięty, to może nie być tak. Spróbowałbym skomentować praktycznie cały twój kod i uczynić go tak, byś miał praktycznie tylko program na cześć świata. Być może nie masz poprawnego ustawienia w obiekcie Module, lub może się nie powieść żądanie pliku inicjującego pamięć (możesz sprawdzić w zakładce Network w przeglądarce dla tego). Jeśli Twój podstawowy program hello world nadal nie działa, możesz wysłać ponownie, wraz z kodem, w osobnym pytaniu.

+0

Zrobiłem tak, jak powiedziałeś i jak się wydaje, wystarczy włączyć sdl.h z prawie pustego projektu, aby to spowodować. –

+0

@ViktorSehr Wpisałbym szczegóły jako osobne pytanie, używając kodu + wiersza poleceń, którego używasz do kompilacji. (Twoje pierwotne pytanie brzmi: "jak to zrobić, znajduję problem", ale teraz jest "jak rozwiązać ten problem") –

+1

"wystarczy włączyć sdl.h z prawie pustego projektu, aby to spowodować" Myślę, że powinien przejść do narzędzia em_sdk i zaktualizować twój kompilator emscripten do najnowszej gałęzi master, a także użyć funkcji "clear cache", aby upewnić się, że odbudowuje ona swoją buforowaną wersję SDL ze źródła. jeśli rzeczywiście masz problem z pakietem SDL (emscripten), to jest błąd, który możesz zgłosić alonowi, myślę, że –

3

Może się to również zdarzyć, gdy w przeglądarce zabraknie pamięci. Niestety obsługa pamięci w przeglądarce nie jest pod naszą kontrolą, więc niewiele można zrobić, oprócz zmniejszenia ładunku. Obejmuje to rozmiar kodu, rozmiar wstępnie załadowanego pliku itp. Zasadniczo wszystko, co może zmniejszyć całkowite zużycie pamięci twojego programu, pomoże naprawić to. Dostawcy przeglądarek nieustannie pracują nad poprawą tego, ale zajmie to jeszcze trochę czasu.

+0

Polecam edycję "to się dzieje, gdy" -> "to może również zdarzają się, gdy ". Bo dla mnie nie stało się to z powodu pamięci, ale z powodu wymienionego w odpowiedzi Michała Charemzy. –