[背景]
我有一个64位本机Linux应用程序在容器中运行。该应用程序不响应网络请求,但运行正常(cpu / mem使用,线程状态正常)。我想看看它的位置是什么"。
主机是CentOS衍生产品,容器具有Ubuntu16.04用户空间,启用AFAICT ASLR。容器没有CAP_SYS_PTRACE功能,我也没有设法从主机连接,也没有在容器内部附加gdb ......
[问题]
所以我列出了所有带有ps
的IP的线程,并试图在符号表中查找IP:
root@0027991aa9d8:/# ps -e Ho pid,tid,stat,comm,class,eip,wchan
PID TID STAT COMMAND CLS EIP WCHAN
1 1 Ssl xxx TS cf5e474d poll_schedule_timeout
1 9 Ssl xxx TS d0580360 futex_wait_queue_me
1 12 Ssl xxx TS cf5f0a13 ep_poll
但EIP值与内存映射中的任何内容都不对应:
[root@bucav70-175 sdc]# cat /proc/1/maps
00400000-00625000 r-xp 00000000 08:02 1197375 /xxx
7fedcf4e9000-7fedcf6a9000 r-xp 00000000 08:02 3828409 /lib/x86_64-linux-gnu/libc-2.23.so
7fedcf8b3000-7fedcf9bb000 r-xp 00000000 08:02 3828441 /lib/x86_64-linux-gnu/libm-2.23.so
...
使用nm -C
查看符号表我看到的地址与proc / x / map一致,但与ps
的输出无关:
...
00000000005a0230 t zmq::thread_t::setSchedulingParameters(int, int)
00000000005a01d0 t zmq::thread_t::stop()
00000000005a0160 t zmq::thread_t::start(void (*)(void*), void*)
...
那么如何确定哪个符号对应于指令指针?
此外,我偶尔会在dmesg
中看到这样的行:
[ +0.000014] traps: xxx-[24878] general protection ip:7f7a40f5b196 sp:7ffd6a9aa220 error:0 in libc-2.23.so[7f7a40f24000+1c0000]
但是这些数字没有任何意义w.r.t. proc / x / maps(上面的dmesg行来自与地图不同的执行)。
请帮我解释这些IP值!
任何有关该主题文档的指针也欢迎!