我是靠谱客的博主 感性石头,最近开发中收集的这篇文章主要介绍android调试小结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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调试小结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部