ps 命令可以显示传递给进程的真实 argv[] 参数吗?

Jim*_*hen 4 ps

这是我今天发现的一个微妙的问题。该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似乎没有提到这个问题。如果不能的话,还有其他工具吗?

这是 Ubuntu Linux 20.04 的屏幕截图。 在此输入图像描述

lne*_*nee 7

不,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获取十六进制并将其转换回二进制因此输出将是一个参数列表,参数之间有一个新行。

  • 另一个选项:`printf %q` 来引用值:`cat /proc/<pid>/cmdline | xargs -0 printf "%q "; 回声` (3认同)