2015-08-06 18 views
10

Quando si esegue l'applicazione asmjs \ emscripten, compilata da C++, ha improvvisamente iniziato a registrare: "run() called, but dependencies remain, so not running" nella console Web e non accade più nulla. Ho aggiunto alcuni cout's all'inizio assoluto del mio main, ma anche loro non sono stati raggiunti.Applicazione Emscripten non in esecuzione

L'applicazione è stata eseguita con successo in precedenza, ma all'improvviso è iniziato a verificarsi e non so quale modifica abbia attivato questo.

Qualcuno sa come eseguire il debug di questo?

Aggiornamento

Dopo aver rimosso il codice sorgente, per quanto ho potuto, questo accade non appena ho # include, anche a causa mia principale consiste semplicemente di un singolo cout.

risposta

1

Penso che non abbiate dato abbastanza informazioni per essere sicuro di sicuro. Ma potrebbe essere ad esempio il fatto che il tuo js abbia attraversato improvvisamente un limite di memoria che supera quello che il browser vuole assegnargli. Potresti provare a ridurre la quantità di memoria utilizzata/lo streaming di alcune risorse invece di precaricarle/spedire meno codice/utilizzare il livello di ottimizzazione di Google?

6

Idealmente si avrebbe l'intero ambiente quando era in esecuzione nel controllo di versione e si costruisce ogni versione da quando si vede dove si è rotta.

Si potrebbe avere il codice in controllo versione, ma forse non Emscripten stesso. Se hai aggiornato Emscripten, questo potrebbe portare a differenze di comportamento. Vorrei provare a tornare a qualsiasi versione che hai usato quando era in esecuzione. Si noti che a volte varie directory della cache sopravvivono a una modifica della versione Emscripten e potrebbe essere necessario cancellarle manualmente (ho dimenticato quale esattamente).

Le dipendenze rimanenti potrebbero significare che si sta tentando di fare qualcosa prima che Emscripten abbia caricato qualsiasi altro file necessario, ad esempio file richiesti da --preload-file o --memory-init-file. Si noti che in base a https://kripken.github.io/emscripten-site/docs/getting_started/FAQ.html#faq-when-safe-to-call-compiled-functions non si dovrebbe provare a eseguire alcuna funzione Emscripten, finché non è stata eseguita la funzione C++ main. Per rilevare questo, è possibile, ad esempio, chiamare la propria funzione Javascript da main (ci sono altri modi).

Il fatto che questo non causasse un problema prima poteva essere qualcosa che sembra del tutto non correlato: una modifica o un aggiornamento nel browser Web, la modifica dei limiti dei download simultanei o una modifica nel server web da cui viene eseguito. Puoi guardare nella scheda Rete nel browser per vedere se qualcosa ti viene fuori come diverso o sospetto.

Tuttavia, poiché il main non viene nemmeno raggiunto, potrebbe non essere quello. Vorrei provare a commentare virtualmente tutto il tuo codice, e farlo in modo tale da non avere praticamente nient'altro che un programma ciao-mondo. Forse non si dispone di un'impostazione corretta nell'oggetto Modulo, o forse la richiesta per il file di inizializzazione della memoria non riesce (è possibile controllare nella scheda Rete nel browser per quello). Se il tuo programma base Hello World non funziona ancora, puoi postare di nuovo, con il suo codice, in una domanda a parte.

+0

Ho fatto come hai detto tu e, a quanto pare, semplicemente includere sdl.h da un progetto quasi vuoto è sufficiente per causare questo. –

+0

@ViktorSehr Vorrei postare i dettagli come una domanda separata, con il codice + la riga di comando che stai usando per compilare. (La tua domanda iniziale è "come faccio a trovare qual è il problema", ma ora è "come posso risolvere questo problema") –

+1

"semplicemente includere sdl.h da un progetto quasi vuoto è sufficiente per causare questo" Penso che tu dovresti andare allo strumento em_sdk e aggiornare il tuo compilatore emscripten al ramo master più recente, e usare anche la funzione "clear cache" per assicurarti che ricostruisca la sua versione cache di SDL dall'origine. se in effetti hai un problema con il pacchetto SDL (emscripten fornito), questo è un bug che puoi segnalare a alon penso che –

3

Ciò può verificarsi anche quando il browser esaurisce la memoria. Sfortunatamente, la gestione della memoria del browser non è sotto il nostro controllo, quindi non c'è molto che puoi fare a parte la riduzione del carico utile. Ciò include le dimensioni del codice, le dimensioni del contenuto del precaricamento, ecc. Fondamentalmente tutto ciò che può ridurre il consumo totale di memoria del tuo programma ti aiuterà a risolverlo. I venditori di browser lavorano costantemente per migliorare questo, ma ci vorrà ancora del tempo.

+0

Ti consiglio di modificare "questo succede quando" -> "questo può anche capita quando ". Perché per me questo non è successo a causa della memoria, ma per la ragione menzionata nella risposta di Michal Charemza. –