了解更多开源请访问:开源基础软件社区https://ost.51cto.comOpenHarmony期间概览在开发过程中,我们肯定会面临各种开发问题,比如如何查看日志,如何查看系统状态,如何调试等等。本章的内容是总结一些常用的工具。交叉编译工具源码下载:5.5forOH3.1,5.7forOH3.2,都可以使用wgethttps://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源码下载wgethttps://mirrors.ustc.edu.cn/gnu/gdb/gdb-8.2.1.tar.gz交叉编译//1.解压工具链tarxvfgcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi.tar.xz//2。解压gdbtarzxvfgdb-8.2.1.tar.gz//3。进入gdb目录编译cdgdb-8.2.1mkdirbuildcdbuild../configureCC="/{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-gnueabimake-j16//4。build目录下的gdb/gdb是一个可执行文件,可以通过文件gdb和内容文件gdb/gdbgdb/gdb查看文件类型:ELF32-bitLSBexecutable,ARM,EABI5version1(GNU/Linux),staticallylinked,对于GNU/Linux2.6.32,BuildID[sha1]=a20d29b723426dbe06a1b17f66292090f916ad21,withdebug_infonot通知:编译好的gdb可以传到设备上运行Valgrind源码下载wgethttps://sourceware.org/pub/valgrind/valgrind-3.18.0.tar.bz2交叉编译//1.解压gdbtarjxvfvalgrind-3.18。0.tar.bz2//2.进入valgrind目录编译cdvalgrind//3。为防止编译后的文件污染源代码,创建目录mkdirbuild//4。进入编译目录cdbuild../configureCC="/{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=/binmake-j16//5.build目录下的coregrind/valgrind是一个可执行文件,可以使用file命令查看文件类型和Contents文件,解释器/lib/ld-linux.so.3,适用于GNU/Linux2.6.32,BuildID[sha1]=3963fa836d42fa54e0cf3c580792b777267f97eb,带debug_info,不剥离文件memcheck/memcheck-arm-linuxmemcheck/memcheckk-arm-linux:ELF32位LSB可执行文件,ARM,EABI5版本1(SYSV),静态链接,BuildID[sha1]=72fa59dfe03270faca9929d6658cb67379ad546d,带有调试信息,未剥离//6。因为是DynamicLink,需要把glib库发给板子,hdc_std-t192.168.137.105:10178filesend/{gccpath}/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/lib/ld-2.21.so/data/local/tmphdc_std-t192.168.137.105:10178文件发送/{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可以使用悟空命令介绍:OpenHarmony稳定性测试自动化工具,通过模拟用户行为,对OpenHarmony系统和应用进行稳定性压力测试约束:悟空是OS3之后预装的。自己手动编译,命令为:./build.sh--product-namerk3568--build-targetwukong编译后发到板子上运行wukongexec-s10-i1000-a0.28-t0.72-c100对应命令说明命令参数值说明wukongexec主命令。-s10参数设置随机种子,10为种子值。-i1000参数设置应用上拉时间间隔,单位为1000ms。-a0.28参数设置应用28%的随机上拉测试比率。-t0.72参数设置屏幕随机触摸测试比例为72%。-c100参数设置执行次数为100次。实时查看linux进程运行状态的top命令:第一行:进程统计,238个进程,1个正在执行(R,top),237个处于休眠状态。第二行:CPU信息,4核(400%),用户层使用5%,系统层使用9%。第三行:具体显示各个进程的信息,包括:PID:进程号USER:进程持有用户PR:进程优先级,值越小,优先级越高NI:进程Nice值,用作修正优先级的值VIRT:进程使用的虚拟内存RES:进程的常驻内存SHR:进程使用的共享内存S:进程状态:S,sleep;R,跑步;我,闲着;%MEM:进程使用内存使用率TIME+:进程占用CPU总时间ARGS:进程名称Tasks:238total,1running,237sleeping,0stopped,0zombieMem:2011776Ktotal,1169240Kused,842536Kfree,39624704个缓冲区交换:总共1048572K,已使用337664K,空闲710908K,缓存316444K400%cpu5%user0%nice9%sys386%idle0%iow0%irq0%sirq0%hostPIDUSERPRNIVIRTRESSHRS[%CPU]%MEMTIME+ARGS512system-3-8120M32M31MS5.61.647:09.18render_service32337root2005.7M3.3M2.7MR4.30.10:02.96top459dsoftbus2003.9G184M2.32MS:11.60softbus_server444hidumper_se+20013M6.2M6.0MS2.60.312:53.76hidumper_servic480wifi2005.5M2.2M2.2MS1.60.115:57.09wifi_hal_service154811015754MS0.66.21:57.38com.ohos.screenlock31536root200000I0.30.01:12.82[kworker/0:0-events_freezable]2090200100155-15637M132M84MS0.3com6.71:06。。1.30:33.25com.ohos.settingsdata436wifi20017M9.0M9.0MS0.30.40:12.66wifi_manager_se233logd2007.4M4.0M2.2MS0.30.23:12.76hilogd32338root00-20I.00:00.00[kworker/0:0H-mmc_complete]32336root2005.4M2.4M2.1MS0.00.10:00.05sh-32335root0-20000I0.00.00:00.00[kworker/3:1H]32331根0-20000I0.00.00:00.00[kworker/2:1H]32327根2005.4M3.1M2.8MS0.00.10:00.06sh-32306rootRT0000S0.00.00:00.01[irq/93-dwc3]32302root200137M3.9M3.4MS0.00.10:00.19通过hdcdPmap命令,我们发现dsoftbus虚拟内存很大,可以使用pmap命令查看具体信息#pmap-x431431:softbus_serverAddressKbytesPSSDirtySwapModeMapping0000d0008000-----[anon:guard:30526]0000f000132880rw---[anon:stack:30526]000300008000-----[anon:guard:30525]00032000132880rw---[anon:stack:30525]000530008000-----[anon:guard:30524]00055000132880rw---[anon:stack:30524]000760008000-----[anon:guard:30523]00078000132880rw---[anon:stack:30523]000990008000-----[anon:guard:30522]0009b000132880rw---[anon:stack:30522]000bc0008000-----[anon:guard:30521]00bd1000132880rw---[anon:stack:30440]00bf20008000r----sa_main00bf400012000r-x--sa_main00bf70004004r----sa_main00bf80004440rw---sa_main00c020004040400rw---[anon:native_heap:musl]01dd20000800------[anon:guard:30309]01dd4000132880rw---[heap]01df500016603723641288rw---[heap]01f9b0008000-----[anon:guard:30308]strace命令源码下载wgethttps://strace.io/files/5.18/strace-5.18.tar.xz交叉编译mkdirbuildcdbuild../configureCC="/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-p431-otrace.straceMeminfo运行#cat/proc/meminfoMemTOTAL:2010244KBMEMFREE:1158060KBMemeMavailable:1412556kbbuffers:1384KBCACHED:291748KBSWAPCACHED:0KBACTIVE:0KBACTIVE:41977KBINACTIVE:41976KBINACTIVE:525356KBACTIVE:525356KBACTIVE(416ANON):316ANON):372KBINIVE:372KIN4purg):0kBInactive(purg):0kBPined(purg):0kBUnevictable:37224kBMlocked:0kBSwapTotal:1048572kBSwapFree:1048572kBDirty:20kBWriteback:0kBAnonPages:311424kBMapped:210128kBShmem:37436kBKReclaimable:39700kBSlab:100004kBSReclaimable:39700kBSUnreclaim:60304kBKernelStack:17664kBPageTables:7380kBNFS_Unstable:0kBBounce:0kBWritebackTmp:0kBCommitLimit:2053692kBCommitted_AS:5178768kBVmallocTotal:262930368kBVmallocUsed:28216kBVmallocChunk:0kBPercpu:832kBSkb:0kBCmaTotal:16384kBCmaFree:0kBGLTrack:-kBZspageUsed:12kB识别方法/proc/meminfo楼上页面的activeanonlru的意思和排错思路active(anon),和下一个项目在inactiveanonlru上转换inactive(anon)pages,只能交换到swap分区,不能回收,如果这两项过大,需要检查应用的两类应用进程。大致思路如下:1、使用top观察内存消耗,筛选进程;2、使用pmap分析进程;3、查看tmpfs,确认unevictableItem内存在系统内存紧张时无法回收。如果这部分继续增长,将导致严重的问题。此项的主要组成部分如下:1.ramdisk或ramfs消耗的内存;2、SHM_LOCK模式下应用的shmem;3、mlock系列函数管理的内存;所以如果这个项目太大,重点关注上面的内容。mlockeditem也是Anunevictable,所以这个item太大检查mlockanonpages这个item是匿名映射页面,注意anonpages!=active(anon)+inactive(anon),因为shmem和tmpfs属于它但不属于anonpages,因为它们有对应的内存文件。所以anonpages属于没有对应文件的内存,而active(anon)和inactive(anon)属于不能回收但可以swap到swap分区的内存。如果此项异常,检查malloc和mmap(PROT_WRITE,MAP_ANON|MAP_PRIVATE)映射。这是mmap(2)申请的内存,还没有unmmap(包括unmmap(2),内核内存回收的unmap。所以查看mmapshmem是否有这个异常,是共享内存,尤其是tmpfs。这个思路主要是:1.使用top查看进程SHR;2.使用pmap查看进程;3.查看tmpfsslab。本项分为可回收的SReclaimable和不可回收的SUnreclaim。如果不可回收的slab泄漏了kmalloc申请的内存没有释放,那就有问题了。排错思路:1、使用slabtop查看哪个slab较大;2.检查kmallocvmallocused用vmalloc分配的内核内存。对于此项,您可以查看/proc/vmallocinfo。如果卸载了驱动,在/proc/vmalloc中是找不到的,需要找到以前的驱动。了解更多开源请访问:开源基础软件社区https://ost.51cto.com
