【发布时间】:2015-10-09 09:53:34
【问题描述】:
根据这个线程,/proc//stat的第30个值(从1开始)应该显示进程的'eip'值。
Get instruction pointer of running application on Unix
但是当我打印 bash 进程的第 30 个值时,它一直返回相同的地址:
root@graphics:/proc# ps | grep bash
3032 pts/21 00:00:00 bash
root@graphics:/proc# cd 3032
root@graphics:/proc/3032# cat stat | awk '{print $30}' | xargs printf "0x%x" && echo
0x7f53790ef84a
root@graphics:/proc/3032# cat stat | awk '{print $30}' | xargs printf "0x%x" && echo
0x7f53790ef84a
root@graphics:/proc/3032# cat stat | awk '{print $30}' | xargs printf "0x%x" && echo
0x7f53790ef84a
root@graphics:/proc/3032# cat stat | awk '{print $30}' | xargs printf "0x%x" && echo
0x7f53790ef84a
root@graphics:/proc/3032# cat stat | awk '{print $30}' | xargs printf "0x%x" && echo
0x7f53790ef84a
root@graphics:/proc/3032# cat stat | awk '{print $30}' | xargs printf "0x%x" && echo
0x7f53790ef84a
root@graphics:/proc/3032# cat stat | awk '{print $30}' | xargs printf "0x%x" && echo
0x7f53790ef84a
root@graphics:/proc/3032# cat stat | awk '{print $30}' | xargs printf "0x%x" && echo
0x7f53790ef84a
root@graphics:/proc/3032# cat stat | awk '{print $30}' | xargs printf "0x%x" && echo
0x7f53790ef84a
即使 chrome 也是如此。我认为'eip'值在执行时会不断变化。为什么总是返回相同的地址?
好的,看了明杰的回答后,我下定决心,如果我超级频繁地检查,这个值是否真的会发生变化。目标进程是 chrome,它的 pid 是 1834。这是我代表我检查值的 bash 脚本:
#!/bin/bash
EIP=
while true; do
NEW_EIP=`cat /proc/1834/stat | awk '{print $30}' | xargs printf "0x%x"`
if [[ "$NEW_EIP" != "$EIP" ]]; then
echo "eip changed! (eip: " $NEW_EIP ")"
fi
EIP=$NEW_EIP
echo $EIP >> $0.dump
done
如果捕获的第 30 个值与之前捕获的值不同,则该脚本旨在打印 eip changed! 消息。当我运行这个脚本时,结果发现它实际上正在改变!
root@graphics:/home/gwangmu/Documents# ./eiptest
eip changed! (eip: 0x7f94e711e8dd )
eip changed! (eip: 0x7f94e868ce0d )
eip changed! (eip: 0x7f94e711e8dd )
eip changed! (eip: 0x7f94e868ce0d )
eip changed! (eip: 0x7f94e711e8dd )
eip changed! (eip: 0x7f94e868cbfa )
eip changed! (eip: 0x7f94e711e8dd )
eip changed! (eip: 0x7f94e868ce0d )
eip changed! (eip: 0x7f94e711e8dd )
eip changed! (eip: 0x7f94e868d23d )
eip changed! (eip: 0x7f94e711e8dd )
eip changed! (eip: 0x7f94e868d23d )
eip changed! (eip: 0x7f94e711e8dd )
eip changed! (eip: 0x7f94e868ce0d )
eip changed! (eip: 0x7f94e711e8dd )
eip changed! (eip: 0x7f94ee983c7a )
eip changed! (eip: 0x7f94e711e8dd )
eip changed! (eip: 0x7f94ee7a1190 )
eip changed! (eip: 0x7f94e711e8dd )
我希望它对其他人有一点帮助。谢谢明杰!
【问题讨论】:
-
那个答案说它是第 29 个字段。 OTOH你在什么架构上?是否有可检索的 eip?
-
我在 x86-64 机器上测试过。由于该答案从 0 开始编号,因此我认为可以将 $30 用于 awk。