所以我遇到了一些奇怪的东西让我松了一段时间。我一直在尝试打印包含字符串元素的ArrayList的内容,有时,一个元素可能包含一个空字符串,这很好,绝对是我的意图。 所以我有这样的事情:
List<String> l = new ArrayList<String>();
//adding strings in l, sometimes it's an empty string
for (int i=0; i < l.size(); i++) {
Log.w("element in l : ", l.get(i));
}
所以在这里,当循环打到空字符串时,logcat根本就不打算将它打印出来(这是我困惑的根源),如果你有一条消息跟在那个无法显示的消息之后,突然,失败的消息将显示为包含新的logcat消息。例如,如果您尝试记录像这样的空字符串
Log.w(TAG, <empty string here>);
Logcat最初不会输出任何内容,然后,当它显示一条新消息时,这就是它打印出来的内容(在这种情况下,新消息是关于AudioTrack的一些警告):
08-21 17:06:02.265 13047-13047/company.myapp W/TAG﹕ [ 08-21 17:06:05.411 766: 937 W/AudioTrack ]
AUDIO_OUTPUT_FLAG_FAST denied by client
我很想知道这是怎么发生的,也许它可以帮助别人不像我那样让我感到非常困惑。我想尝试记录一个空字符串会触发某种缓冲区,直到它被打印出来,这是一个错误吗?
答案 0 :(得分:4)
这是一个有趣的问题。我刚刚在LogRabbit中尝试了这个,并且能够看到相同的结果。
我快速浏览了android源代码,看到Log.W(...)以本机代码结束并在logd_write.c中处理
这基本上将数据写入/ dev / log / main(或其他日志之一)
你可以得到这样的日志:
adb pull /dev/log/events .
adb pull /dev/log/main .
adb pull /dev/log/radio .
adb pull /dev/log/system .
您需要按cntl-C,否则副本将永久发生。
查看/ dev / log / main中的原始日志,我看到消息确实已记录:
<8b>F×U^_<8c>^Y^U^Emfl_MessageList^@Before Empty^@^R^@^@^@!z^@^@!z^@^@
<8b>F×U^_<8c>^Y^U^Emfl_MessageList^@^@^]^@^@^@!z^@^@!z^@^@
<8b>F×U^_ <8c>^Y^U^Emfl_MessageList^@After Empty^@7^@^@^@^@^E^@^@^Z^E^@^@
由logger.h中找到的结构解码所以我认为这是adb中的一个问题。从这里拉source code :(看起来像那里的一些未记录的命令)
这是主要功能
static int logcat(TransportType transport, const char* serial, int argc, const char** argv) {
char* log_tags = getenv("ANDROID_LOG_TAGS");
std::string quoted = escape_arg(log_tags == nullptr ? "" : log_tags);
std::string cmd = "shell:export ANDROID_LOG_TAGS=\"" + quoted + "\"; exec logcat";
if (!strcmp(argv[0], "longcat")) {
cmd += " -v long";
}
--argc;
++argv;
while (argc-- > 0) {
cmd += " " + escape_arg(*argv++);
}
return send_shell_command(transport, serial, cmd);
}
在那里我看到所有logcat基本上都是这样的:
adb shell
> exec logcat
所以我认为问题的根源在于logcat本身。 Logcat.cpp调用log_read.c
基于我快速阅读的内容,我认为发生的事情是消息未正确终止。在附加另一条消息并且第一条消息超出并显示第二条消息之前,空消息不会显示,因为它具有适当的终止。