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