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