Android應用調試時沒有stdout和stderr的輸出,網上看到的解釋都是下面這個樣子:
#################################################
Android系統在默認情況下,將stdout和stderr(Java中的System.out 和 System.err)重定向到/dev/null。
如果一個進程運行了 Dalvik VM,那么就可以把上面兩個輸出拷貝到日志文件中去,這種情況下,系統會把stdout
和stderr輸出到標簽為“stdout”和“stderr”的日志中。
具體做法如下:
$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
(以上命令執行之后立即生效,不過,如果重啟手機,則上面的設置就消失了。
可以在 /data/local.prop 文件中加入命令,從而無需重新執行以上命令。)
##################################################
經過實驗,這個方法可以輸出JAVA代碼中的System.out/err。但是現在很多應用為了跨平台用C/C++開發(特別是游戲,我調試的也是游戲),C/C++中的std::cout/printf用這種方法並不能輸出,網上有些解釋說需要先root設備($adb root),再執行上面的語句。由於我的情況不允許root,所以就沒有驗證。
繼續網上搜索資料,發現一個方法:
freopen函數。
這個函數是用來重定向的,具體用法可以可以自行google。
我在我項目C/C++代碼執行的入口地方加入了下面代碼:
freopen("/sdcard/tmp/loglog.txt", "w", stdout);
重新編譯執行,所有std::cout/printf的輸出都輸出到了指定文件中。需要注意的是:參數一指定的路徑必須是存在的,而且必須有這個路徑的寫權限。否則,這個代碼“沒有任何效果”。
這個方法很好解決了我的問題,特此記錄一下。