2011-03-31 15 views
10

Ho scaricato SDL 1.3 e l'ho testato insieme a OpenGL ES sul mio dispositivo Android 2.2. Funziona bene ma non ottengo le uscite dalle chiamate printf. Ho provato i comandi di seguito come menzionato allo android developer page ma né DDMS in Eclipse né adb logcat riporta le stringhe che il programma scrive usando printf. Ho fatto in modo di filtrare il tag stdout.Perché il reindirizzamento di stderr/stderr su Android non funziona?

$ adb shell stop 
$ adb shell setprop log.redirect-stdio true 
$ adb shell start 

Cosa mi manca o cosa non funziona?

+0

FWIW, questo fa sì che Dalvik VM crei un thread che copia stdout/stderr nel file di registro. Devi essere root per fermare/avviare il framework dell'app. Vedi anche http://stackoverflow.com/questions/17188987/android-native-code-debugging/17199704#17199704. – fadden

risposta

1

Un altro modo per fare ciò è avere un file /data/local.prop, contenente solo la riga log.redirect-stdio=true. Forse funziona meglio? Inoltre, si noti che lo stdout è memorizzato nel buffer, quindi potrebbe essere che l'output sia ancora nel buffer, in attesa di essere scaricato. È possibile chiamare manualmente fflush per verificarlo.

+0

adb push local.prop /data/local.prop non funziona a causa delle autorizzazioni. Devo eseguire il root del mio dispositivo? – trenki

+1

Hmm, non mi ero reso conto che questo avrebbe causato problemi su un dispositivo. Comunque funziona bene sull'emulatore. So che l'emulatore è un problema da usare, specialmente con OpenGL, ma forse è un'opzione per la risoluzione dei problemi incidentali? Secondo un messaggio di David Turner sul gruppo NDK (vedi http://groups.google.com/group/android-ndk/msg/0d37b24df6df7cde), stop/setprop/start dovrebbe essere considerato non supportato. – svdree

+0

Funziona da C? Vedo l'output di stderr su logcat da java quando faccio questo, ma non vedo l'output delle chiamate C su qualcosa come fprintf (stderr, "qualcosa"). –

2

Secondo questa presentation, log.redirect-stdio è per l'uscita Dalvik, per reindirizzare l'uscita C/C++ (come printf), è necessario installare busybox sul dispositivo e usare la sua utilità xargs come questo:

myprogram | xargs log 

Questo ovviamente funziona per il codice che viene chiamato come eseguibile standalone. Se è solo a scopo di debug, puoi scrivere un piccolo programma per chiamare la tua libreria e chiamarla dall'applicazione utilizzando xargs.

+1

Vedere la mia risposta a http://stackoverflow.com/questions/9192749/capturing-stdout-stderr-with-ndk per una soluzione con pipe anziché busybox. –

Problemi correlati