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

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

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

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

答案1

不,PS 不能(我认为),但你可以从 proc 中获取它,例如/proc/PID/cmdlinecmdline 文件是一个程序参数的空分隔列表,因此该脚本将解析它

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

相关内容