[background]
У меня в контейнере работает 64-битное собственное приложение linux.Приложение не отвечает на сетевые запросы, но в остальном работает нормально (использование процессора / памяти, состояние потоков в порядке).Я хотел бы увидеть, где находятся его шаги.
Хост является производным от CentOS, контейнер имеет пользовательское пространство Ubuntu16.04, AFAICT ASLR включен.Контейнер не имеет возможности CAP_SYS_PTRACE, и мне не удалось подключиться ни с хоста, ни внутри контейнера с помощью gdb ...
[вопрос]
Итак, я перечислилвсе потоки с IP с ps
и пытались найти 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]
Но ни одно из чисел не имеет никакого смысла для proc / x / maps (приведенная выше строка dmesgвыполняется не так, как карты).
Пожалуйста, помогите мне интерпретировать эти значения IP!
Любые указатели на документацию по теме также приветствуются!