#盲盒+码# #跟着小白一起学鸿蒙#OpenHarmony调试工具 原创 精华

左翼风发
发布于 2022-12-29 15:47
浏览
4收藏

作者:王石

概述

OpenHarmony开发过程中我们一定会面对各种开发问题,比如如何看log,如何看系统状态,如何调试,等等。本章内容就是总结一些常用工具。

交叉编译工具

  • 源码下载:OH3.1用的5.5,OH3.2升级了5.7,两者都能用

wget https://releases.linaro.org/components/toolchain/binaries/latest-5/arm-linux-gnueabi/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi.tar.xz

  • 解压、配置好路径(这个就不细讲了,可自行百度)

GDB

  • 源码下载

    wget https://mirrors.ustc.edu.cn/gnu/gdb/gdb-8.2.1.tar.gz
    
  • 交叉编译

    //1. 解压工具链
    tar xvf gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi.tar.xz
    
    //2. 解压gdb
    tar zxvf gdb-8.2.1.tar.gz
    
    //3. 进入gdb目录编译
    cd gdb-8.2.1
    mkdir build
    cd build
    ../configure CC="/{gcc的路径}/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc" CXX="/{gcc的路径}/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++" LDFLAGS=-static --target=arm-linux-gnueabi --host=arm-linux-gnueabi
    make -j16
    //4. build目录下gdb/gdb就是可执行文件,可以通过file gdb查看文件类型和内容
    file gdb/gdb
    gdb/gdb: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=a20d29b723426dbe06a1b17f66292090f916ad21, with debug_info, not stripped
    

    注意:编译后的gdb即可传输到设备上运行

Valgrind

  • 源码下载

    wget https://sourceware.org/pub/valgrind/valgrind-3.18.0.tar.bz2
    
  • 交叉编译

    //1. 解压gdb
    tar jxvf valgrind-3.18.0.tar.bz2
    
    //2. 进入valgrind目录编译
    cd valgrind
    
    //3. 防止编译文件污染源码,建立目录
    mkdir build
    
    //4. 进入编译目录
    cd build
    ../configure CC="/{gcc的路径}/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc" CXX="{gcc的路径}/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++" CPP="/home/wshi/arm-toolchain/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-cpp" --target=arm-linux-gnueabi --host=arm-linux-gnueabi --prefix=/bin
    
    make -j16
    
    //5. build目录下coregrind/valgrind就是可执行文件,可以通过file命令查看文件类型和内容
    file coregrind/valgrind
    coregrind/valgrind: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=3963fa836d42fa54e0cf3c580792b777267f97eb, with debug_info, not stripped
    file memcheck/memcheck-arm-linux
    memcheck/memcheck-arm-linux: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, BuildID[sha1]=72fa59dfe03270faca9929d6658cb67379ad546d, with debug_info, not stripped
    
    //6. 由于是DynamicLink,所以需要发送glib库到板子上,
    hdc_std -t 192.168.137.105:10178 file send /{gcc的路径}/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/lib/ld-2.21.so /data/local/tmp
    hdc_std -t 192.168.137.105:10178 file send /{gcc的路径}/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/lib/libc-2.21.so /data/local/tmp
    
    //7. 发送valgrind到板子上,并发送memcheck-arm-linux到板子,放到/bin/lib/valgrind目录,如没有需要自己建目录,这样valgrind就能用了
    

WuKong命令

  • 简介:OpenHarmony稳定性测试自动化工具,通过模拟用户行为,对OpenHarmony系统及应用进行稳定性压力测试。

  • 约束条件:WuKong在OS3.2系统版本后开始预置使用;OH3.1需要自己手动编译,命令为:

    ./build.sh --product-name rk3568 --build-target wukong
    
  • 编译后发到板子上运行

    wukong exec -s 10 -i 1000 -a 0.28 -t 0.72 -c 100
    
  • 对应命令解释

    命令 参数值 说明
    wukong exec 主命令。
    -s 10 参数设置随机种子,10为种子值。
    -i 1000 参数设置应用拉起间隔,1000单位ms。
    -a 0.28 参数设置应用随机拉起测试比例28%。
    -t 0.72 参数设置屏幕随机touch测试比例为72%。
    -c 100 参数设置执行次数为100次。

Top命令

实时查看linux进程运行情况的命令:

第一行:进程统计,238个进程,一个正在执行(R,top),237个休眠的

第二行:CPU信息,4核(400%),5%用户层在用,9%系统层在用

第三行:具体显示每个进程信息,包括:

  • PID:进程号
  • USER:进程持有用户
  • PR:进程优先级,数值越小优先级越高
  • NI:进程Nice值,用作优先级的修正值
  • VIRT:进程使用的虚拟内存
  • RES:进程常驻内存
  • SHR:进程使用的共享内存
  • S:进程状态:S,sleep;R,running;I,idle;
  • %MEM:进程使用的内存占用比
  • TIME+:进程占用的CPU总时长
  • ARGS:进程名
Tasks: 238 total,   1 running, 237 sleeping,   0 stopped,   0 zombie
  Mem:  2011776K total,  1169240K used,   842536K free,  39624704 buffers
 Swap:  1048572K total,   337664K used,   710908K free,   316444K cached
400%cpu   5%user   0%nice   9%sys 386%idle   0%iow   0%irq   0%sirq   0%host
  PID USER         PR  NI VIRT  RES  SHR S[%CPU] %MEM     TIME+ ARGS
  512 system       -3  -8 120M  32M  31M S  5.6   1.6  47:09.18 render_service
32337 root         20   0 5.7M 3.3M 2.7M R  4.3   0.1   0:02.96 top
  459 dsoftbus     20   0 3.9G 184M  32M S  2.6   9.3  13:11.60 softbus_server
  444 hidumper_se+ 20   0  13M 6.2M 6.0M S  2.6   0.3  12:53.76 hidumper_servic
  480 wifi         20   0 5.5M 2.2M 2.2M S  1.6   0.1  15:57.09 wifi_hal_service
 1548 10007         5 -15 649M 122M  94M S  0.6   6.2   1:57.38 com.ohos.screenlock
31536 root         20   0    0    0    0 I  0.3   0.0   1:12.82 [kworker/0:0-events_freezable]
 2090 20010015      5 -15 637M 132M  84M S  0.3   6.7   1:06.40 com.ohos.settings
 2049 20010035      0 -20 643M 122M  77M S  0.3   6.2   1:01.51 ohos.samples.bttest
 1532 10004         0 -20 519M  29M  27M S  0.3   1.4   0:31.95 com.ohos.mms
 1483 10005         0 -20 516M  26M  24M S  0.3   1.3   0:33.25 com.ohos.settingsdata
  436 wifi         20   0  17M 9.0M 9.0M S  0.3   0.4   0:12.66 wifi_manager_se
  233 logd         20   0 7.4M 4.0M 2.2M S  0.3   0.2   3:12.76 hilogd
32338 root          0 -20    0    0    0 I  0.0   0.0   0:00.00 [kworker/0:0H-mmc_complete]
32336 root         20   0 5.4M 2.4M 2.1M S  0.0   0.1   0:00.05 sh -
32335 root          0 -20    0    0    0 I  0.0   0.0   0:00.00 [kworker/3:1H]
32331 root          0 -20    0    0    0 I  0.0   0.0   0:00.00 [kworker/2:1H]
32327 root         20   0 5.4M 3.1M 2.8M S  0.0   0.1   0:00.06 sh -
32306 root         RT   0    0    0    0 S  0.0   0.0   0:00.01 [irq/93-dwc3]
32302 root         20   0 137M 3.9M 3.4M S  0.0   0.1   0:00.19 hdcd

Pmap命令

通过Top命令,我们发现dsoftbus虚拟内存很大,我们可以使用Pmap命令查看具体信息

# pmap -x 431
431: softbus_server
Address    Kbytes     PSS   Dirty    Swap  Mode  Mapping
0000d000       8       0       0       0 -----    [anon:guard:30526]
0000f000     132       8       8       0 rw---    [anon:stack:30526]
00030000       8       0       0       0 -----    [anon:guard:30525]
00032000     132       8       8       0 rw---    [anon:stack:30525]
00053000       8       0       0       0 -----    [anon:guard:30524]
00055000     132       8       8       0 rw---    [anon:stack:30524]
00076000       8       0       0       0 -----    [anon:guard:30523]
00078000     132       8       8       0 rw---    [anon:stack:30523]
00099000       8       0       0       0 -----    [anon:guard:30522]
0009b000     132       8       8       0 rw---    [anon:stack:30522]
000bc000       8       0       0       0 -----    [anon:guard:30521]
00bd1000     132       8       8       0 rw---    [anon:stack:30440]
00bf2000       8       0       0       0 r----  sa_main
00bf4000      12       0       0       0 r-x--  sa_main
00bf7000       4       0       0       4 r----  sa_main
00bf8000       4       4       4       0 rw---  sa_main
00c02000      40      40      40       0 rw---    [anon:native_heap:musl]
01dd2000       8       0       0       0 -----    [anon:guard:30309]
01dd4000     132       8       8       0 rw---    [heap]
01df5000    1660     372     364    1288 rw---    [heap]
01f9b000       8       0       0       0 -----    [anon:guard:30308]

Strace命令

  • 源码下载

    wget https://strace.io/files/5.18/strace-5.18.tar.xz
    
  • 交叉编译

    mkdir build
    cd build
    ../configure CC="/home/wshi/workspace/master-1014/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc" CXX="/home/wshi/workspace/master-1014/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/arm-linux-gnueabi-g++" --target=arm-linux-gnueabi --host=arm-linux-gnueabi
    
  • 运行

    strace -f -t -p 431 -o trace.strace
    

Meminfo

  • 运行

    # cat /proc/meminfo
    MemTotal:        2010244 kB
    MemFree:         1158060 kB
    MemAvailable:    1412556 kB
    Buffers:            1384 kB
    Cached:           291748 kB
    SwapCached:            0 kB
    Active:            41976 kB
    Inactive:         525356 kB
    Active(anon):        372 kB
    Inactive(anon):   311204 kB
    Active(file):      41604 kB
    Inactive(file):   214152 kB
    Active(purg):          0 kB
    Inactive(purg):        0 kB
    Pined(purg):           0 kB
    Unevictable:       37224 kB
    Mlocked:               0 kB
    SwapTotal:       1048572 kB
    SwapFree:        1048572 kB
    Dirty:                20 kB
    Writeback:             0 kB
    AnonPages:        311424 kB
    Mapped:           210128 kB
    Shmem:             37436 kB
    KReclaimable:      39700 kB
    Slab:             100004 kB
    SReclaimable:      39700 kB
    SUnreclaim:        60304 kB
    KernelStack:       17664 kB
    PageTables:         7380 kB
    NFS_Unstable:          0 kB
    Bounce:                0 kB
    WritebackTmp:          0 kB
    CommitLimit:     2053692 kB
    Committed_AS:    5178768 kB
    VmallocTotal:   262930368 kB
    VmallocUsed:       28216 kB
    VmallocChunk:          0 kB
    Percpu:              832 kB
    Skb:                   0 kB
    CmaTotal:          16384 kB
    CmaFree:               0 kB
    GLTrack:               - kB
    ZspageUsed:           12 kB
    
  • 识别方法

    /proc/meminfo 含义和排查思路
    active(anon) 在active anon lru上的page,和楼下项目互相转换
    inactive(anon) 在inactive anon lru上的page,特征是只能被交换到swap分区,不可被回收。此项和楼上就是应用程序使用malloc和mmap匿名方式来申请并写后的内存,如果这两项过大,那需要排查应用程序的这两类申请流程,常规思路如下:1,用top观察内存消耗,初筛进程;2,用pmap分析进程;3,排查tmpfs确认
    unevictable 此项内存在系统内存紧张时也不能被回收,这部分如果持续增长会引起严重问题。此项主要组成如下:1,ram disk或ramfs消耗的内存;2,以SHM_LOCK方式申请的shmem;3,用mlock系列函数管理的内存;所以若此项过大,重点看以上内容
    mlocked 此项也是一种unevictable,所以此项过大查mlock
    anonpages 此项是匿名映射页,注意 anonpages != active(anon)+inactive(anon),因为shmem,tmpfs,虽然属于其中但是因为有对应的内存文件所以不属于anonpages。所以anonpages属于没有对应文件的内存,而active(anon)和inactive(anon)属于不可回收但可以被交换到swap分区的内存。若此项异常,查看malloc和mmap(PROT_WRITE,MAP_ANON|MAP_PRIVATE)
    mapped 此项为用mmap(2)申请的内存,且没被unmmap(包括unmmap(2),及内核内存回收的unmap。所以此项异常查mmap
    shmem 此项即为共享内存,尤其是tmpfs。这项思路主要是:1,用top看进程SHR;2,用pmap看进程;3,看tmpfs
    slab 此项可分为可被回收的SReclaimable以及不可回收的SUnreclaim,其中不可被回收的slab如果发生泄漏如kmalloc请求的内存没释放那就有问题了,排查思路:1,用slabtop查看哪一个slab大;2,排查kmalloc
    vmallocused 用vmalloc方式分配的内核内存,针对此项可查看/proc/vmallocinfo。如果驱动被卸载则不会在/proc/vmalloc里被发现,则需要查找过往的驱动。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
4
收藏 4
回复
举报
3条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

大佬常用的工具,必须收藏一波

1
回复
2022-12-29 20:04:44
渴望学习的阿诺德
渴望学习的阿诺德

很多没见过的工具,周末试试

1
回复
2022-12-30 11:04:51
诺舒华吃西瓜
诺舒华吃西瓜

大佬会出这些工具的教程吗

1
回复
2022-12-30 18:37:37
回复
    相关推荐