Я использую контейнеры Docker на основе тега «ubuntu» и не могу получить инструмент linux perf для отображения отладочных символов.Как вы получаете отладочные символы, работающие в linux perf tool внутри контейнеров Docker?
Вот что я делаю, чтобы продемонстрировать проблему.
Сначала я запускаю контейнер, здесь с интерактивной оболочкой.
docker run -t -i ubuntu:14.04 /bin/bash
Тогда из подсказки контейнера я устанавливаю linux perf tool.
apt-get update
apt-get install -y linux-tools-common linux-tools-generic linux-tools-`uname -r`
Теперь я могу использовать инструмент perf
. Мое ядро - 3.16.0-77-generic
.
Теперь я смогу установить gcc
, скомпилировать тестовую программу и попытаться запустить ее под perf record
.
apt-get install -y gcc
я вставляю в программе испытаний в test.c
:
#include <stdio.h>
int function(int i) {
int j;
for(j = 2; j <= i/2; j++) {
if (i % j == 0) {
return 0;
}
}
return 1;
}
int main() {
int i;
for(i = 2; i < 100000; i++) {
if(function(i)) {
printf("%d\n", i);
}
}
}
Затем компилировать, запускать, и сообщить: gcc -g -O0 test.c && perf record ./a.out && perf report
Результат выглядит примерно так: 72.38% a.out a.out [.] 0x0000000000000544 8.37% a.out a.out [.] 0x000000000000055a 8.30% a.out a.out [.] 0x000000000000053d 7.81% a.out a.out [.] 0x0000000000000551 0.40% a.out a.out [.] 0x0000000000000540
У этого нет символов, даже если исполняемый файл имеет символ л информации.
делая те же самые общие шаги за пределы контейнера работает отлично, и показывает что-то вроде этого: 96.96% a.out a.out [.] function 0.35% a.out libc-2.19.so [.] [email protected]@GLIBC_2.2.5 0.14% a.out [kernel.kallsyms] [k] update_curr 0.12% a.out [kernel.kallsyms] [k] update_cfs_shares 0.11% a.out [kernel.kallsyms] [k] _raw_spin_lock_irqsave
В принимающей системе я уже включен символы ядра, становясь корнем и делают: echo 0 > /proc/sys/kernel/kptr_restrict
Как заставить контейнерную версию работать правильно и отображать отладочные символы?
Спасибо, это было именно так. Чтобы добавить решение, чтобы получить символы ядра, вам также необходимо добавить: '--kallsyms =/proc/kallsyms'. –
В случае, если это помогает кому-либо еще: еще более простой способ - вызвать 'docker run' с' -v/var/lib/docker /:/var/lib/docker', что делает так, что 'perf' не требует никаких специальные аргументы для правильного разрешения символов. –
А, это хороший. –