这是我今天发现的一个微妙的问题。该ps
命令可以显示进程的命令参数,但我发现该功能不完善。
对于如下的 shell 命令行:
gdbserver localhost:5050 testg "hello world" 123
我们知道gdbserver
将会main()
看到:
argv[] | C 字符串 |
---|---|
argv[1] | 本地主机:5050 |
argv[2] | 测试组 |
argv[3] | 你好世界 |
argv[4] | 123 |
然而,ps -ef
节目
gdbserver localhost:5050 testg hello world 123
因此它看起来像是argv[3]
,hello
这很容易引起误导。
所以问题就清楚了,有没有办法让 ps 显示真实argv[]
值?man ps
似乎没有提到这个问题。如果不能,还有其他工具吗?
答案1
不,PS 不能(我认为),但你可以从 proc 中获取它,例如/proc/PID/cmdline
cmdline 文件是一个程序参数的空分隔列表,因此该脚本将解析它
hexdump -v -e '/1 "%02X "' /proc/PID/cmdline | sed 's/00/0a/g' | xxd -r -p
hexdump -v -e '/1 "%02X "' /proc/PID/cmdline
将以十六进制形式转储文件,每个部分之间都有一个空格。sed 's/00/0a/g'
将 00 (空)替换为 0a (行尾或新行)xxd -r -p
采用十六进制并将其转换回二进制,因此输出将是一个参数列表,其中参数之间有一个新行。