如何检查进程的图像?

问题描述

首先我用 ps 找到进程的 pid:

% ps -a | grep 'a.out'

输出

36296 pts/0    00:00:07 a.out

然后我用 gcore 得到这个过程的图像:

% sudo gcore 36296

输出

0x0000558eab27d131 in main ()
warning: Memory read Failed for corefile section,4096 bytes at 0xffffffffff600000.
Saved corefile core.36296
[Inferior 1 (process 36296) detached]

然后,十六进制转储对象:

% hd core.36296 | grep 'HOME'

输出

001f4a90  3d 32 00 48 4f 4d 45 3d  2f 68 6f 6d 65 2f 63 61  |=2.HOME=/home/ca|

现在,我试图找到加载环境变量的部分。我该怎么做?

解决方法

你应该使用调试器!

对于 linux、gcc 和 gdb,你可以这样做:

> gdb <executable> <core-file>

在 gdb 中,您现在可以从核心文件检查环境:

 (gdb) print ((char**)__environ)[0]
$1 = 0x7ffc6aba0a58 "SHELL=/bin/bash"
(gdb) print ((char**)__environ)[1]
$2 = 0x7ffc6aba0a68 "SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1873,unix/unix:/tmp/.ICE-unix/1873"

除非你得到一个长度为 0 的字符串。

如果您没有带有调试信息的可执行文件,您也可以尝试使用以下命令查找文本:

strings –a <core-file>

但在编写核心文件并尝试在其中搜索之前,如果您的程序仍在运行,您只需使用 ps 从进程中获取环境:

ps eww <pid>