top的Bug

发现了Ubuntu 10.10下的procps 3.2.8-9ubuntu3的top的一个Bug:

$ top -U tux

    top: unknown argument 'O'

usage:    top -hv | -bcisSH -d delay -n iterations [-u user | -U user] -p pid [,pid ...]

发现只要是-U后的用户名存在,那么就出这样莫名其妙的错误。

后来简单printf研究了一阵子后,打算用GDB。需要在procps的Makefile里面,把CFLAGS变量里面的-s去掉,加上-g选项,或者-ggdb选项。GCC中这两个参数的含义是:

-s  Remove all symbol table and relocation information from the

           executable.

-g  Produce debugging information in the operating system's native

           format (stabs, COFF, XCOFF, or DWARF 2).  GDB can work with this

           debugging information.

通过GDB研究程序运行流程发现,top的parse_args函数在处理完-U参数的时候,本来应该指向字符串末尾'\0'的指针指到了后面无关的区域,又进行了一边参数处理,开头的unknown argument 'O'就是这样造成的。需要在处理完-U参数后,让指针先往前指一位再处理就好了,不会再进行一次错误的参数处理了。top的这个Bug不是上游包引起的,而是Debian加这个补丁的时候引进去的。

为此我写了补丁并提交。