ADB logcat exit on tag [duplicate] - android

This question already has an answer here:
Send data back to the script which started the activity via adb shell am start
(1 answer)
Closed 4 years ago.
Im trying to filter android logcat at real time and execute some command or exit from logcat when specific tag occured. I tried the following:
adb shell "logcat | grep 'sometag' && echo 'Tag occured'"
adb shell logcat -m --regex='sometag'
In second command -m does not work at all, but is listed in logcat documentation.
Any ideas how can i do this?

Answer (maybe temporary because infinite loop is not a best idea):
Because i'm scripting in PowerShell i found that solution:
While(1) {
$log = & $abdPath shell "logcat -d | grep 'onPause'"
if($log) {
break;
}
}
Thanks for down voting without any reason :)

Related

How to check if the app has crashed/stop working using adb shell?

I'm currently doing this:
-d: call logcat only once and return
adb shell logcat -d
Then I do a regex search in the log for Caused by.*"apk name".
The problem is, sometimes it does generate this message in the log but the app is still responsive/working.
Would like to ask if there's any better way to check if an app stop working, using adb shell commands.
By stop working I mean, it still open but doesn't responds to anything.
Note: I'm not looking for what caused the app to crash, just if it has stopped working.
Did you know that:
Android stores trace information when it experiences an App is Not Responding (ANR).
You can get more information here: https://developer.android.com/topic/performance/vitals/anr#diagnosing_anrs
With this information, I was able to determine if the app is in ANR state via the following commands:
First, get the PID of your app:
adb shell ps | grep <app.package.name>
The value in second column is the PID. Then, enable root access:
adb root
Finally, check the /data/anr/:
adb shell grep <PID> /data/anr/*<app.package.name>*
Note that the asterisks (*) in the last command are important. If you see something like below, your app is in ANR state.
/data/anr/traces_app.package.name.txt:----- pid 11828 at 2021-09-06 03:00:05 -----
/data/anr/traces_app.package.name.txt: | sysTid=11828 nice=0 cgrp=default sched=0/0 handle=0xb6f5cbec
/data/anr/traces_app.package.name.txt:----- end 11828 -----
you can try :
adb shell pid of the app
It returns the PID if such process was found or an empty string otherwise.
for pid u can use adn shell ps
like user1506104 suggests: looking for the deovr player on my oculus quest 2:
... MINGW64 /e/pt
$ ./adb shell ps | grep com.deovr.gearvr
u0_a90 3936 695 3212880 614872 0 0 S com.deovr.gearvr
$ ./adb shell ps -p 3936
USER PID PPID VSZ RSS WCHAN ADDR S NAME
u0_a90 3936 695 3212880 616096 0 0 S com.deovr.gearvr
You can use also command for directly knowing what is happening with error stack and you will be also able to reach any of crashes:
adb logcat *:E
Here you can get also more options:
https://developer.android.com/studio/command-line/logcat#options
Getting actual ANR stack - check this thread how to obtain it from shell:
Android: How to obtain data/anr/traces.txt from Samsung Galaxy Tab?

adb shell one-liner not passing output properly [duplicate]

This question already has an answer here:
Send data back to the script which started the activity via adb shell am start
(1 answer)
Closed 4 years ago.
I am trying to write a script that will pull any photos or videos I've taken today. Here is what the code looks like:
for i in $(adb shell ls -l /sdcard/DCIM/Camera/ | grep $(date +%Y-%m-%d) | awk '{ print $7 }' ) ; do adb pull /sdcard/DCIM/Camera/$i ~/Photos ; done
And here is the error I get when I run it:
' does not existsdcard/DCIM/Camera/IMG_20160507_012827.jpg
It properly grabs the name the file(s) that need to be pulled, but for some reason it doesn't pass that information to "adb pull" properly.
Do I need to do something else to "sanitize" the output of one command into the input of the other?
why don't you just try find to list down all the files which are modified in last 24 hours and copy them to desired directory ?
find ~/desired/source -mtime -1 -type f -print0 | xargs -0 cp -t ~/destination/picture

adb logcat specific app only [duplicate]

I observed that when i use Logcat with Eclipse with ADT for Android, I get messages from many other applications as well. Is there a way to filter this and show only messages from my own application only.
Linux and OS X
Use ps/grep/cut to grab the PID, then grep for logcat entries with that PID. Here's the command I use:
adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel | tr -s [:space:] ' ' | cut -d' ' -f2`"
(You could improve the regex further to avoid the theoretical problem of unrelated log lines containing the same number, but it's never been an issue for me)
This also works when matching multiple processes.
Windows
On Windows you can do:
adb logcat | findstr com.example.package
Package names are guaranteed to be unique so you can use the Log function with the tag as your package name and then filter by package name:
NOTE: As of Build Tools 21.0.3 this will no longer work as TAGS are restricted to 23 characters or less.
Log.<log level>("<your package name>", "message");
adb -d logcat <your package name>:<log level> *:S
-d denotes an actual device and -e denotes an emulator. If there's more than 1 emulator running you can use -s emulator-<emulator number> (eg, -s emulator-5558)
Example: adb -d logcat com.example.example:I *:S
Or if you are using System.out.print to send messages to the log you can use adb -d logcat System.out:I *:S to show only calls to System.out.
You can find all the log levels and more info here: https://developer.android.com/studio/command-line/logcat.html
http://developer.android.com/reference/android/util/Log.html
EDIT: Looks like I jumped the gun a little and just realized you were asking about logcat in Eclipse. What I posted above is for using logcat through adb from the command line. I'm not sure if the same filters transfer over into Eclipse.
Since Android 7.0, logcat has --pid filter option, and pidof command is available, replace com.example.app to your package name.
(ubuntu terminal / Since Android 7.0)
adb logcat --pid=`adb shell pidof -s com.example.app`
or
adb logcat --pid=$(adb shell pidof -s com.example.app)
For more info about pidof command:
https://stackoverflow.com/a/15622698/7651532
Add filter
Specify names
Choose your filter.
This works for me with USB debugging:
The solution is to use your device's own logcat directly via shell.
Connect the device and use:
adb shell
Use logcat after the shell is set up:
logcat | grep com.yourapp.packagename
For me this works in mac Terminal
Got to the folder where you have adb then type below command in terminal
./adb logcat MyTAG:V AndroidRuntime:E *:S
Here it will filter all logs of MyTAG and AndroidRuntime
Update May 17
It's been a few years, and thing have changed. And Eclipse is no longer officially supported. So here's two more up-to-date approaches:
1. Android Studio
In the Android monitor toolbox, you can filter logcat per debuggable process. Normally, when you develop an application it is a debuggable process. Every once in a while I am having issues with this, and a do the following:
Tools -> Android -> Enable ADB Integration.
If it was already enabled, then toggle it off, and then back on
Unplug and replug your mobile device.
There are also options to filter via regex and the debug level
2. logcat-color
This is a nice python wrapper on top of adb logcat if you want to use a terminal based solution. The good thing about it is that you can save multiple configurations and simply reuse them. Filtering by tags is quite reliable. You can also filter by package to see logs of one or more apps only, but you start logcat-color right before launching your app.
Old Answer:
It seems that I can't comment to previous answers, so I will post a new one.
This is a comment to Tom Mulcahy's answer, that shows how the command should change so as to work on most devices, since adb shell ps PID column is variable.
NOTE: The command below works for the cases where you have connected many devices. So device id is needed. Otherwise, you can simply omit the brackets '[', ']'
1. To find out the column of pid, type:
adb [-s DEVICE_ID] shell ps | head -n 1
Now memorise the column number for the PID. Numbering starts from 1.
2. Then type the following:
adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')
Simply put the column you memorised in PUT_COLUMN_HERE, e.g. $5
Caveat
Each time you re-run your application, you have to re-run the 2nd command, because the application gets a new PID from the OS.
Ubuntu : adb logcat -b all -v color --pid=`adb shell pidof -s com.packagename` With color and continous log of app
This has been working for me in git bash:
$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
put this to applog.sh
#!/bin/sh
PACKAGE=$1
APPPID=`adb -d shell ps | grep "${PACKAGE}" | cut -c10-15 | sed -e 's/ //g'`
adb -d logcat -v long \
| tr -d '\r' | sed -e '/^\[.*\]/ {N; s/\n/ /}' | grep -v '^$' \
| grep " ${APPPID}:"
then:
applog.sh com.example.my.package
Using Windows command prompt: adb logcat -d | findstr <package>.
*This was first mentioned by jj_, but it took me ages to find it in the comments...
adb logcat -e "appname"
This works prefectly when filtering rows for one app only.
If you are using Android Studio you can select the process from which you want to receive logcats.
Here is the screenshot.
I wrote a shell script for filtering logcat by package name, which I think is more reliable than using
ps | grep com.example.package | cut -c10-15
It uses /proc/$pid/cmdline to find out the actual pid, then do a grep on logcat
https://gist.github.com/kevinxucs/7340e1b1dd2239a2b04a
Use -s !
You should use your own tag, look at:
http://developer.android.com/reference/android/util/Log.html
Like.
Log.d("AlexeysActivity","what you want to log");
And then when you want to read the log use>
adb logcat -s AlexeysActivity
That filters out everything that doesn't use the same tag.
Source
ADT v15 for Eclipse let you specify an application name (which is actually the package value in your androidmanifest.xml).
I love being able to filter by app, but the new logcat has a bug with the autoscroll. When you scroll up a little to look at previous logs, it automatically scrolls back to the bottom in a couple seconds. It seems scrolling 1/2 way up the log does keep it from jumping back to the bottom, but that's often useless.
EDIT: I tried specifying an app filter from the command-line -- but no luck. If someone figures this out OR how to stop the autoscroll, please let me know.
LogCat Application messages
As a variant you can use third party script PID Cat by Jake Wharton. This script has two major advantages:
shows log entries for processes from a specific application package
color logcat
From documentation:
During application development you often want to only display log messages coming from your app. Unfortunately, because the process ID changes every time you deploy to the phone it becomes a challenge to grep for the right thing.
This script solves that problem by filtering by application package.
An output looks like
In order to access the logcats you first need to install ADB command-line tool. ADB command-line tool is a part of android studio platform tools and can be downloaded from here. After this, you need to set the path/environment variable for adb tools. Now you can access logcat from eclipse terminal/ intellij terminal or mac terminal in case you are using a macbook.
adb logcat : To get entire logcat.
adb shell pidof 'com.example.debug' : To get the process id of your app.
adb logcat pid=<pid> : To get logcat specific to your app.
adb logcat pid=<pid>|grep 'sometext' : To filter logcat on basis of some text.
For more info about filtering logcats read this.
On Windows 10, using Ionic, what worked great to me was combine 'findstr' with the "INFO:CONSOLE" generated by all App messages.
So, my command in command line is:
adb logcat | findstr INFO:CONSOLE
I'm not sure there's a way to only see system messages regarding your app, but you can filter based on a string. If you're doing a log within the program, you can just include a certain unique keyword, and filter based on that word.
Try: Window -> Preferences -> Android -> LogCat. Change field "Show logcat view if ..." the value "VERBOSE". It helped me.
If you are using Eclipse, press the green + sign in the logCat window below and put your package name (com.example.yourappname) in the by Application Name box. Also, choose any name comfortable to you in Filter Name box and click ok. You will see only messages related to your application when the filter you just added is chosen from the left pane in the logCat.
Give your log a name. I called mine "wawa".
In Android Studio, go to Android-> Edit Filter Configurations
Then type in the name you gave the logs. In my case, it's called "wawa". Here are some examples of the types of filters you can do. You can filter by System.out, System.err, Logs, or package names:
This is probably the simplest solution.
On top of a solution from Tom Mulcahy, you can further simplify it like below:
alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Usage is easy as normal alias. Just type the command in your shell:
logcat
The alias setup makes it handy. And the regex makes it robust for multi-process apps, assuming you care about the main process only.
Of coz you can set more aliases for each process as you please. Or use hegazy's solution. :)
In addition, if you want to set logging levels, it is
alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
You can use below command to fetch verbose logs for your application package
adb logcat com.example.myapp:V *:S
Also if you have rolled out your app and you want to fetch error logs from released app, you can use below command.
adb logcat AndroidRuntime:E *:S
I am usually adding something in the log messages to make it distinct. Or for example unity app you can use "Unity" as matching string.
For mac :
adb logcat | grep "MyUniqueString"
for Windows (powershell ):
adb logcat | Select-String "MyUniqueString"
I have different approach, you can try access to local device's shell.
adb shell
and then follow by
logcat | grep com.package.name
This print all containing that package.
Alternatively, You can try flutter logs --verbose
Another way of getting logs of exact package name when you are inside the shell:
logcat --pid $(ps -ef | grep -E "com.example.app\$" | awk '{print $2}')
I tried to use Tom Mulcahy's answer but unfortunately it was not working for applications with multiple processes so I edit it to fit my needs.
#!/bin/bash
if [ "$#" -ne 1 ]; then echo "Illegal number of parameters"; exit 1; fi
echo "Lof for package name: $1"
PROCESSES=`adb shell ps | grep "$1" | cut -c10-15`
NUM_OF_PROCESSES=`echo "$PROCESSES" | wc -l`
if [ $NUM_OF_PROCESSES -eq 0 ]; then echo "The application is not running!"; exit 1; fi
COUNTER=1
for process in $PROCESSES; do
if [ $COUNTER -eq 1 ]; then GREP_TEXT="("; fi
GREP_TEXT+=$process
if [ $COUNTER -eq $NUM_OF_PROCESSES ]; then GREP_TEXT+=")"; else GREP_TEXT+="|"; fi
let COUNTER=COUNTER+1
if [ $COUNTER -gt $NUM_OF_PROCESSES ]; then break; fi
done
adb logcat | grep -E "$GREP_TEXT"
In addition to Tom Mulcahy's answer, if you want to filter by PID on Windows' console, you can create a little batch file like that:
#ECHO OFF
:: find the process id of our app (2nd token)
FOR /F "tokens=1-2" %%A IN ('adb shell ps ^| findstr com.example.my.package') DO SET PID=%%B
:: run logcat and filter the output by PID
adb logcat | findstr %PID%

Using ADB command know the name of application focussed using adb [duplicate]

This question already has answers here:
ADB - Android - Getting the name of the current activity
(13 answers)
Closed 4 years ago.
I am using the
adb shell input keyevent KEYCODE_DPAD_LEFT
to focus on an application, now i want to know the name of the application on which this has focussed using adb shell command.
NOTE: not exactly the name of application, it can focus on anything. SO i want to get the Text on which it focusses.
Ok. To do it, you need to use grep terminal application on your phone (the easiest way with rooted phone with busybox package). Let do the same steps as below:
C:\Users\Hasan>adb shell input keyevent KEYCODE_DPAD_LEFT
C:\Users\Hasan>adb shell
shell#android:/ $ su
su
root#android:/ # dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
mCurrentFocus=Window{42079c60 com.jrummy.liberty.toolboxpro/com.jrummy.apps.rom.toolbox.RomToolboxActivity paused=false}
mFocusedApp=AppWindowToken{4283d918 token=Token{426709a8 ActivityRecord{41e37c60 com.jrummy.liberty.toolboxpro/com.jrummy.apps.rom.toolbox.RomToolboxActivity}}}
root#android:/ #
Now you'll see which activity has focus :)
You can use:
adb shell uiautomator dump /dev/tty
You will get an XML describing the current screen, one of the many <node>-elements will have an attribute focused="true". It may also have a text-attribute and a lot more UI-informations.

Killing android monkey process via adb only [duplicate]

This question already has answers here:
How do I stop the monkey madness?
(6 answers)
Closed 5 years ago.
I have a problem with a monkey process. Starting Monkey is easy, but how to stop it?
I know how to stop any process, but I have no idea how the monkey process is called.
DDMS shows a "?" process, and that's it, but I have to kill it with an adb command.
Any idea?
Command :
adb shell ps | awk '/com\.android\.commands\.monkey/ { system("adb shell kill " $2) }'
worked on android 2.3
Do adb shell ps
Search for process name monkey. note down pid of the monkey process
(pidvalue)
adb shell kill pidvalue. - where pidvalue is pid of monkey
process.
That's all. monkey runner is stopped.
Just run it with a set number of events:
$ adb shell monkey -p your.package.name -v NUMEVENTS
If you didn't know what you were getting into and ran monkey with a silly number of events (anything with > 3 zeros), you can kill it as described by both the answers in how do I stop the monkey madness!
On an emulator with Android 2.2 the monkey process is called 'app_process'.
You can stop it with
adb shell ps | awk '/app\_process/ { system("adb shell kill -9 " $2) }'

Categories

Resources