Trying to output my LogCat to a file - android

I've been told it's a command line option. But Eclipse's Run!Run Configurations...!Target!Additional Emulator Command Line Options field is already occupied with
-sdcard "C:\android-sdk-windows\tools\sd9m.img"
If I wanted to write something like
adb logcat -s MessageBox > "C:\Users\me\Documents\LogCatOutput.txt"
then where do I write it, and how (i.e., is the syntax even correct)? I need to output only a filtered tag, not verbose. ("MessageBox" is my TAG. Again I don't know if any of this punctuation is right, or even where the command goes.)
Thanks for any help.

There should be an adb.exe file in C:\android-sdk-windows\tools. You can invoke this manually from a DOS command prompt:
cd C:\android-sdk-windows\tools
adb logcat -s MessageBox > "C:\Users\me\Documents\LogCatOutput.txt"
There's no need to bother with Eclipse in this case.

Alternatively, if you only want to dump whatever's already in the logcat buffers and exit immediately (useful for scripts), you can specify the -d option:
$ adb logcat -d -s MessageBox > dump_file.txt
Make sure that '-d' is after 'logcat'.

Another useful addition to the above answers is filtering. The application I am working on generates a massive amount of logging, so it is useful to log with filters.
adb -s MyDevice logcat | find /V ": T#" > d:\temp\logcat.txt
or for OSX/Linux
adb -s MyDevice logcat | grep -v ": T#" > ~/logcat.txt
This will write all logcat activity apart from any line that contains ": T#"
find or grep can also be used to filter based on positive results. I then use the likes of BareTail display the growing log file.

Related

logcat '*:W' -d -f /mycache/log.txt outputs Info and Debug lines

Inside Android (not on adb), we need logcat '*:W' -d -f /mycache/log.txt to obey the *:W and only put Warning and Error lines into log.txt.
But -f appears to not obey the :W, and we get all the excess lines in the log.
Variations with > don't work thru .exec(), and I don't want to collect the output as a stream when the low-level command should obey me.
take out the '':
Runtime.getRuntime().exec("logcat *:W -d -f " + logFile.getAbsoluteFile());
It turns out .exec() calls the raw process loader, not a command shell, so it wouldn't have expanded the *, so the '' aren't needed or expected.
(I posted because I thought I already tried that;)

Meaning of am_activity_launch_time?

I am seeking a way to measure launch times of general apps in Android, and happen to know that
adb logcat -b events | grep am_activity_launch_time
might be one answer.
But I failed to find out what duration the command above shows (i.e., from what event to what event). Any help?
You can use this command
cmd0=add logcat -c
to clear the logs and then execute the below command
cmd1 = "grep am_activity_launch_time Example.txt | grep com.example.example| cut -d ',' -f4-4 > Example.csv"
The values are then saved in a csv file.
Then you can the python commands
os.system(cmd0);
os.system(cmd2);
Then use matplotlib to plot the graph from the generated csv files.
axes=plt.gca()
axes.set_xlim([1,20])
axes.set_ylim([0,4000])
plt.title("Performance Analysis ")
plt.ylabel('Time in milliseconds')
plt.xlabel('Number of itirations (DEVICE:Samsung Galaxy Note 4)')
data1=np.genfromtxt("Example.csv)"
plt.plot(data1,label="Example",linewidth=2.0,color='m')
plt.legend(bbox_to_anchor=(1,1),loc=1,borderaxespad=0.)
plt.show()
Once this is done execute this file in the python cmd.
adb logcat -b all | egrep -n --color 'Displayed *'
12461:11-26 22:43:05.316 1110 1167 I ActivityTaskManager: Displayed mobi.goldendict.android.free/mobi.goldendict.android.GoldenDict: +1s494ms
You could measure app launches time in android by this.

Shell manipulation to get a file from android

I have an Android device from which I need to obtain a log file from. The log file changes every time it's created, so I cannot simply hardcode the name of the file into my script.
What I am thinking, is doing a
adb shell "rm /data/trace/*"
to delete everything but that file in the folder before I generate the log file. Then maybe I could do
adb pull "/data/trace/`adb shell ls /data/trace/`"
What I would think this does is execute the ls command it it'll list the only file there. And the rest of this would cause it to pull "/data/trace/file".
However, this doesn't work.
I get the error:
' does not existdata/trace/log.8290
Does anybody have any tips on how I could do this?
Thanks.
So it turns out that there's an added carriage return '\r' at the end which messes up the syntax.
This is what I did to solve the problem.
test_file=`adb shell ls /data/trace/`;
test_file2=`echo $test_file | tr -d '\r'`;
echo "grabbing $test_file2";
adb pull "/data/trace/$test_file2";
This strips the carriage return off the file name and makes it possible so I can use it in my adb pull code.
Cheers.

Why is nohup still causing a process being run in a shell script to terminate?

I am logging the data coming from top and putting it into a circular set of files. I am not executing top for one set of data and then rerunning for the next set, but instead using a read time out to specify when to go from one log file to the next. This is primarily done this way to remove the startup CPU load cost every time top is executed. The shell script file's name is toplog.sh and looks similar to this:
#!/data/data/com.spartacusrex.spartacuside/files/system/bin/bash
date
echo " Logging started."
fileCmp()
{
test `ls -lc "$1" | sed -n 's/\([^ ]* *\)\{4\}\([0-9]*\).*$/\2/;p'` $2 $3
}
oldest()
{
ls -rc $1 2> /dev/null |head -1
}
file=`oldest /mnt/sdcard/toplog.\*.gz`
echo " Oldest file is $file"
if [ -z "$file" ]; then
x=0
else
file=${file%%.gz}
file=${file##*.}
x=$file
fi
echo " x=$x"
top -d 20 -b | \
while true; do
file=/mnt/sdcard/toplog.$x.gz
while read -t 5 line; do
echo "$line"
done | gzip -c > $file
if fileCmp "$file" -le 300; then
date
echo " Failure to write to file '$file'."
exit
fi
x=$((($x+1)%10))
sleep 14
done
I execute this using nohup so that when the shell dies, this process still runs, like so:
$ nohup ./toplog.sh
But there's a problem. top terminates when I exit the shell session that executed that command, and I'm not exactly sure why. Any ideas?
To clarify, I'm logging on a Android phone. The tools are limited in functionality (i.e. lack some of these switches) and is why I am using top as it contains the output I want.
Version of busybox I'm using is:
BusyBox 1.19.2 (2011-12-12 12:59:36 GMT)
Installed when I installed Terminal IDE.
BTW, this phone is not rooted. I'm trying to track down a failure when my phone responds as if the CPU has spiked and won't go down.
Edit:
Well, I found a workaround. But the reason is a bit hazy. I think it has to do with process management and smells of a bug in the busybox ver that I'm using that was missed during regression testing.
The workaround is to wrap top with a useless loop structure like this: while true; do top; done. Through testing, top never gets killed and never gets respawned, but by wrapping it up, it isn't killed.
Any insights on this?
going to sound stupid, but change your startup command from
nohup ./toplog.sh
to
nohup ./toplog.sh &
the & makes it run as a background process further removing it from the terminal stack.
Running the bash internal command "disown" on your script's process before logging off may prevent it from being signaled.

Filter android logcat ouput for multiple tags

I want to capture logs and dump them into a text file, I am using a perl script to do this. The issue I am running into is that I want to include only certain tags in my logcat command.
I am using
$adbcommand_logcat = "start \"Android-Logcat\" cmd /c \"adb -s $sno logcat -s ^(?=.*?\babc\b)(?=.*?\bxyz\b)(?=.*?\bpqr\b).*$ | -v threadtime | tee ".$mainlog_filename."\"";
but this gives me a blank log instead of the log with tags specified in the regex. If I take out -s after logcat then the regex does not works and log includes everything.
Any help is appreciated.
I got it to work using the following command with egrep.If you don't have the tag try to find the process name and use it instead.
$adbcommand_logcat = "adb -s $sno logcat -v threadtime | egrep \"tag1 or Process 1| tag2 or Process 2\" |tee ".$mainlog_filename;

Categories

Resources