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. 源码下载

ncurses下载地址

版本: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. 源码下载

procps-ng下载地址

版本: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文件后还需要修改CFLAGSLDFLAGS

-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

Q1:adb shell使用top乱码

top源码中对字符串有做处理,可以修改procps-ng-3.3.12/top/top.c将如下的处理代码return掉。

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

Q3:top线程名称显示不全

此问题同版本相关,请使用procps-3.1.12版本即可解决。