有时候第三方应用程序的日志输出是通过printf之类的标准函数输出的,logcat不能捕获到这些日志。一个技巧是使用logwrapper命令来执行第三方应用程序,logwrapper可以把标准输出重定向到adb log中去。(缺省级别是LOGI)
Usage: logwrapper [-x] BINARY [ARGS ...]
Forks and executes BINARY ARGS, redirecting stdout and stderr to
the Android logging system. Tag is set to BINARY, priority is
always LOG_INFO.
-x: Causes logwrapper to SIGSEGV when BINARY terminates
fault address is set to the status of wait()
Source for logwrapper is at: system/core/logwrapper/logwrapper.c
例如,在adb shell下
root@android:/ ps
ps的结果只在当前控制台下输出,要想把ps的结果输出到adb log中去,可以使用:
root@android:/ logwrapper ps
这样adb logcat就能捕获到ps的输出了
linux console:
http://bbs.ednchina.com/BLOG_ARTICLE_1799023.HTM
android init:
http://blog.csdn.net/hongjiujing/article/details/6832825
源码是Flying项目(http://code.google.com/p/flying-on-android/)中的ToolIO.cpp
这个程序主要演示了如何重定向一个程序的STDOUT和STDERR。
Android中由系统启动的进程,默认STDOUT和STDERR是被定向到/dev/null中去的,所以,从adb shell是看不到程序的输出的,只能通过LOGW等打印,然后通过logcat查看。
不过,从shell启动的可执行二进制程序倒是没有被重定向,STDOUT和STDERR都被定向到启动程序时的终端。可以编译运行一下ToolIO:
ToolIO
使用默认的STDOUT和STDERR。可以看到所有输出。
ToolIO console
把STDOUT和STDERR重定向到/dev/console。输出效果和重定向前一样。
ToolIO null
把STDOUT和STDERR重定向到/dev/null。重定向后看不到任何输出。
这说明,通过串口从SHELL启动ToolIO时,程序的STDOUT和STDERR和ToolIO一样,都是/dev/console,所以重定向到/dev/console时,输出没有什么改变。
Android源码中有很多printf,但这些输出在串口是看不到的, 因为这些源码编出的程序并没有通过串口启动。
另外,Android的bionic中stderr默认是没有缓冲的,而stdout是有缓冲的。有缓冲,写到stdout中的字符会被积累起来,直到堆满缓冲区或者遇到/n才会把所有内容一次打印出来。
问个windows的问题 我在程序a有printf的语句 然后我这样调用 a>log.txt,把标准输出重定向到log.txt 现在问题是我printf之后,数据不会立刻输出到log.txt,会缓存起来直到一定的量 怎样能让printf之后,log.txt立刻能看到结果
LS的解释是正确的printf是行缓冲,只有缓冲满或换行时才刷新显示。 解决方法是在printf后加一句fflush(stdout);来手动刷新缓冲即可。
你的printf 有没有 \n 回车符。因为 printf 是行缓冲的。