概述
1, Shell支持作用控制,有以下命令实现前后台切换:
1. command& 让进程在后台运行
2. jobs 查看后台运行的进程
3. fg %n 让后台运行的进程n到前台来
4. bg %n 让进程n到后台去
2, wifi adb连接
adb connect <设备的IP地址>:5555
setprop service.adb.tcp.port 5555
stop adbd
start adbd
adb tcpip 5555
adb connect 192.168.1.110
adb shell
adb disconnect
3, kernel文件动态调试功能-- dynamic_debug 打开及半闭
配置config:
CONFIG_DEBUG_FS=y
CONFIG_DYNAMIC_DEBUG=y
内核log接口如:
pr_debug(KERN_INFO "%s xxxxxxxxxxxxn", __FUNCTION__);
打开动态调试:
#echo 'file hub.c +p' > /sys/kernel/debug/dynamic_debug/control
关闭动态调试:
#echo 'file hub.c -p' > /sys/kernel/debug/dynamic_debug/control
打开log等级:
#echo 8 > /proc/sys/kernel/printk
在Linux内核代码里当需要限制printk打印频率时会用到__ratelimit或printk_ratelimit(封装了__ratelimit) printk_ratelimit默认允许在5s内最多打印10条消息出来。可通过 /proc/sys/kernel/printk_ratelimit (多长时间)和 /proc/sys/kernel/printk_ratelimit_burst (在printk_ratelimit时间段内最多允许的消息数量DEFAULT_RATELIMIT_BURST)。当然如果内核代码里没有调用printk_ratelimit就不受这两个值的限制。
4, apk
aapt dump badging $1
pm install $1
am start -n 包名/main_activity名
su - uart_rw -c "am start -n com.example.test/.MainActivity"
pm disable xxx
5,远程操作
scp file xxx@192.168.111.111:/home/xxx/
ssh root@192.168.111.111
rdesktop -f -a 16 XXX.XXX.XXX.XXX
6, 烧写bootloader分区
echo 0 > /sys/block/mmcblk0boot0/force_ro
dd if=boot.img of=/dev/mmcblk0boot0
echo 1 > /sys/block/mmcblk0boot0/force_ro
7, dump调试:
service list
dumpsys ****
debuggerd -b PID
java dump:
import android.util.Log;
Log.d(TAG, Log.getStackTraceString(new Trowable()));
C++ dump:
#include <utils/Callstack.h>
Callstack stack;
stack.update();
stack.dump(); dump调试:
kernel dump:
dump_stack();
8,问题:
位于分支 master
您的分支落后 'develop/master' 共 2 个提交,并且可以快进。
(使用 "git pull" 来更新您的本地分支)
解决:
git stash ; git pull; git stash pop
git reset --hard HEAD~3
9,uboot下读写mmc分区
mmc dev 0
fatls mmc 0
fatload mmc 0 0x10800000 u-boot.bin
bsp flash -e 0x08000000 0x080e0000
bsp flash -w 0x08000000 0x080e0000 0x10800000
10, 小计:
while true then; do kill `ps |grep vold|busybox awk '{print $2}'`;sleep 1;done
得到当前进程:get_task_struct(current);
记录进程优先级:task_nice(current);
dpkg
kthread_create(...)
kthread_run(...)
INIT_WORK(...)
queue_work(...)
aarch64-linux-gnu-objdump -D vmlinux > vmlinux.dis
strace -o xxx.log xxx 》》》》》 获取该应用涉及的所有系统调用
readelf -d xxx
screencap XXX.bmp
sudo mount -o offset=2366636032 PC8-1-t.img map/
解包:
abootimg -x boot.img
重新打包:
abootimg --create boot.img -f bootimg.cfg -k zImage -r initrd.img
11, 挂载vendor.img、system.img
out/host/linux-x86/bin/simg2img vendor.img vendor.img.raw
mount -t ext4 -o loop vendor.img.raw tmp/
12, 解析dtb设备树
# dtc -I dtb -O dts -o xxx.dts xxx.dtb
13, 解析tombstore文件
》20:04:59:756 backtrace:
》20:04:59:757 #00 pc 0001cdea /system/bin/connectmanager
》20:04:59:757 #01 pc 0001d655 /system/bin/connectmanager
addr2line -C -f -e connectmanager 0001cdea
addr2line -C -f -e connectmanager 0001d655
14, vi替换所有字符串
grep -rl string1 ./ | xargs sed -i "s/string1/string2/g"
15, 压力测试神器stress-ng 》固定cpu负荷
16, 进程绑定到CPU
Linux提供一个接口,可以将进程绑定到特定的CPU:
#include <sched.h>
int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
参数
pid:进程的id号,如果pid为0,则表示本进程
cpusetsize:mask的大小
mask:运行进程的CPU,可以通过以下函数操作mask
#define CPU_SET(cpu, cpusetp) //设置cpu
#define CPU_CLR(cpu, cpusetp) //删除cpu
#define CPU_ISSET(cpu, cpusetp) //判断cpu
#define CPU_ZERO(cpusetp) //初始化为0
int main(int argc, char **argv)
{cpu_set_t mask;
while(1)
{
CPU_ZERO(&mask);
CPU_SET(0, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
perror("sched_setaffinity");
}
}
不仅仅进程可以绑定到CPU,线程也可以。Linux提供一个接口,可以将线程绑定到特定的CPU:
#include <pthread.h>
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);
该接口与进程绑定到CPU的接口的使用方法基本一致。
当进程绑定到特定的CPU之后,线程还是可以绑定到其他的CPU的,没有冲突。
void *thread_func1(void *param)
{
cpu_set_t mask;
while(1)
{
CPU_ZERO(&mask);
CPU_SET(3, &mask);
if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
&mask) < 0) {
perror("pthread_setaffinity_np");
}
WasteTime();
}
}
int main(int argc, char *argv[])
{
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
perror("sched_setaffinity");
}
pthread_t my_thread;
if (pthread_create(&my_thread, NULL, thread_func1,
NULL) != 0) {
perror("pthread_create");
}
while(1) { WasteTime(); }
pthread_exit(NULL);
}
17,usb不响应问题(resume失败):
USB口在移除USB设备的时候,会启动一个延时为2秒的auto-suspend操作。OTG口在HOST模式下如果先移除一个USB设备,然后去切换DEVICE模式,再切换回HOST模式,这时候HOST口会立马进行一个resume的操作。如果这个resume的动作时间点,刚好落在之前2秒的auto-suspend的到期时间点上,则会发生auto-suspend和resume操作冲突的情况,导致resume失败,而这会导致HSOT口失效,对于设备插拔没有响应。
修改的方案:OTG口切换到device的时候,将/sys/bus/usb/devices/usb1/power/autosuspend_delay_ms设备节点写0,切换回host模式的时候,将/sys/bus/usb/devices/usb1/power/autosuspend_delay_ms设备节点写2000。这个节点默认值是2000,相当于做一个恢复的操作。
18,
#define func_line_info(info)
printk("-- func:%s, line:%d , %s--n", __func__, __LINE__, info);
#define func_line_info2(info1, info2)
printk("-- func:%s, line:%d , %s %s--n", __func__, __LINE__, info1, info2);
19, Android9 C/C++打印调用栈的方法 此部分摘自Android9 C/C++打印调用栈的方法_u012773843的博客-CSDN博客_c 打印调用栈
一、C++打印调用栈
1.包含两个头文件
#include <utils/Log.h>
#include <utils/CallStack.h>
2.编写打印调用栈函数
void dumping_callstack() {
CallStack stack; //如果这里的函数不在android命名空间内,则要改为 android::CallStack stack;
stack.update();
stack.dump(1); //输出到printf
stack.log("dump_test"); //输出到logcat
//stack.log("Dumping Stack",ANDROID_LOG_ERROR ,"123 "); //可以设置第2、3个参数
}
3.在函数中调用
void func() {
dumping_callstack();
}
4.修改mk或bp文件
如果是bp文件,则在 shared_libs 中加上 “libutilscallstack”,这是Android新版本的特性;//最好把 "libutils"和"libcutils"也加上;
如果是mk文件,则在 LOCAL_SHARED_LIBRARIES 后面加上 libutilscallstack libutils libcutils
二、C打印调用栈
1.创建callstack.h
void dumping_callstack();
2.创建callstack.cpp
#include <utils/CallStack.h>
extern "C" void dumping_callstack();
void dumping_callstack(){
android::CallStack stack;
stack.update();
stack.log("dump_minbuffer");
}
3.在函数中调用
同上
4.修改mk或bp文件
和上面一样,另外还需要把callstack.cpp添加到编译选项中,在LOCAL_SRC_FILES加上callstack.cpp
windows cmd for:
for /l %%i in (41,1,100) do copy 4320_00001.png 4320_000%%i.png
内存问题debug:
+CONFIG_SLUB=y
+CONFIG_SLUB_DEBUG_ON=y
+CONFIG_SLUB_STATS=y
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
+CONFIG_DEBUG_KMEMLEAK=y
+CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y
+CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4096
makefile添加debug:ccflags-y += -DDEBUG
最后
以上就是感性石头为你收集整理的android调试小结的全部内容,希望文章能够帮你解决android调试小结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复