Top移植和使用参考
1. 移植¶
top是一个在终端中显示实时系统状态的命令行工具,它提供了一个动态的、交互式的系统监视器,用于查看系统的各种性能指标和进程信息。
公版默认的top是集成在busybox中,用户在实际场景中可能需要单独编译top工具,可以通过procps-ng工具集生成,版本如下:
- procps-ng:3.3.12
- ncurses:6.1
1.1. 传统方式¶
1.1.1. ncurses交叉编译¶
ncurses是一个用于控制终端屏幕输出和响应用户输入的开源库,它提供了一套函数和数据结构,用于创建终端界面和处理基于文本的用户界面(TUI)应用程序。
1.1.1.1. 源码下载
版本:6.1
1.1.1.2. 交叉编译
资源包下载完成后,解压进入目录,执行配置文件配置编译工具链和指定相应的安装路径,如下:
tar -zxvf ncurses-6.1.tar.gz cd ncurses-6.1/ export PATH=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:$PATH ; export ARCH=arm64 ; export CROSS_COMPILE=aarch64-linux-gnu- ./configure --host=aarch64-linux-gnu CPPFLAGS="-P" --prefix=$PWD/install --disable-shared --enable-static --disable-stripping --without-debug make clean -j8 make -j8 make install
注意上述示例步骤中的export命令指定的编译链地址,实际操作时请根据真实的编译链路径进行声明。同时使用--disable-shared --enable-static
配置生成静态库,执行上述步骤后将在ncurses-6.1/install/
路径下找到生成的头文件和库文件。
1.1.2. procps-ng交叉编译¶
procps-ng是一个用于监视系统进程和提供与进程相关信息的开源工具集,是procps工具集的下一代版本,旨在提供更好的稳定性、可移植性和功能扩展性。
1.1.2.1. 源码下载
版本:3.3.12
1.1.2.2. 交叉编译
资源包下载完成后,解压进入目录,执行配置文件配置安装目录,如下:
tar -xvf procps-ng-3.3.12.tar.xz cd procps-ng-3.3.12/ export PATH=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:$PATH ; export ARCH=arm64 ; export CROSS_COMPILE=aarch64-linux-gnu- echo "ac_cv_func_realloc_0_nonnull=yes" > arm-linux.cache echo "ac_cv_func_malloc_0_nonnull=yes" >> arm-linux.cache ./configure --disable-shared --enable-static --host=aarch64-linux-gnu NCURSES_CFLAGS="-I/home/veahow.chen/opensource/procps-ng-3.3.12/../ncurses-6.1/install/include/ncurses/" NCURSES_LIBS="-L/home/veahow.chen/opensource/procps-ng-3.3.12/../ncurses-6.1/install/lib -lncurses" --prefix=$PWD/install --with-ncurses --cache-file=arm-linux.cache
注意上述示例步骤中的export命令指定的编译链地址,实际操作时请根据真实的编译链路径进行声明。注意这里为了不依赖动态库,使用了静态编译配置--disable-shared --enable-static
。
执行上述步骤后将在procps-ng-3.3.12/
路径下找到生成的Makefile文件,生成Makefile文件后还需要修改CFLAGS
和LDFLAGS
:
-CFLAGS = -g -O2 +CFLAGS = -g -O2 -I/home/veahow.chen/opensource/procps-ng-3.3.12/../ncurses-6.1/install/include/ncurses/ -I/home/veahow.chen/opensource/procps-ng-3.3.12/../ncurses-6.1/install/include/ ... -LDFLAGS = +LDFLAGS = -L/home/veahow.chen/opensource/procps-ng-3.3.12/../ncurses-6.1/install/lib
修改后执行如下命令编译与安装:
make clean -j8 make -j8 make install
最终将在procps-ng-3.3.12/install/bin
下找到生成的top程序。原有生成的程序大小较大,可以通过如下命令进行裁剪:
cd install/bin/
aarch64-linux-gnu-strip top --strip-unneeded
1.2. 基于Buildroot¶
Top属于procps-ng包,版本为3.3.12
export PATH=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:$PATH ; export ARCH=arm64 ; export CROSS_COMPILE=aarch64-linux-gnu- cd 3rdparty/buildroot-masters make procps-ng
通过该方式构建出来的top依赖动态库libprocps.so.6和libncurses.so.6,相关lib库集成在3rdparty/buildroot-master/output/target/usr/lib/文件夹下。
2. 环境搭建¶
2.1. 拷贝文件¶
将程序拷贝至project/release/chip/pcupid/dispcam/common/glibc/10.2.1/release/bin/debug
目录下,并通过chmod +x命令添加可执行权限。
2.2. 镜像打包¶
在project
下执行make image_install
将会打包程序到project/image/output/customer
。
3. 测试验证¶
板端运行一个指定线程名的应用,测试代码如下:
#define _GNU_SOURCE #include <stdio.h> #include <pthread.h> // Thread function void* threadFunc(void* arg) { const char* threadName = (const char*) arg; printf("Thread %s is running\n", threadName); // Do some work here for (;;) ; // ... return NULL; } int main() { pthread_t thread; const char* threadName = "WorkerThread"; // Create thread pthread_create(&thread, NULL, threadFunc, (void*) threadName); pthread_setname_np(thread, threadName); // Wait for thread to finish pthread_join(thread, NULL); printf("Thread finished\n"); return 0; }
使用如下命令生成测试程序:
export PATH=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:$PATH ; export ARCH=arm64 ; export CROSS_COMPILE=aarch64-linux-gnu- aarch64-linux-gnu-gcc -lpthread pthread.c -o pthread
将测试程序拷贝至板端后测试Top命令。
3.1. top验证¶
3.2. top -H验证¶
3.3. top -Hbp验证¶
能够看到正常显示出测试程序的线程名。
3.4. adb shell后top验证¶
4. 常用Q&A¶
Q2:运行top -Hbp xx出现'dumb': unknown terminal type.
可以进入板端使用如下命令解决:此报错是指远端sh命令中没有scp,并不是指本地。scp会通过ssh给远端下scp cmd,从code中加打印可以看到命令如下:
cd /config/terminfo
mkdir d
cp v/vt100 d/dumb