问题描述
首先我用 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>