Android中使用logwrapper来重定向应用程序中的标准输出 _linux console_android init_abdroid stdout err重定向

有时候第三方应用程序的日志输出是通过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 是行缓冲的。

你可能感兴趣的:(Android中使用logwrapper来重定向应用程序中的标准输出 _linux console_android init_abdroid stdout err重定向)