J'utilise des conteneurs Docker basés sur la balise "ubuntu" et je ne peux pas obtenir l'outil de perfusion linux pour afficher les symboles de débogage.Comment obtenez-vous les symboles de débogage qui travaillent dans l'outil de perfusion linux dans les conteneurs Docker?
Voici ce que je fais pour démontrer le problème.
D'abord, je démarre un conteneur, ici avec un shell interactif. Puis, à partir de l'invite de conteneur, j'installe l'outil de perfusion linux. Je peux maintenant utiliser l'outil perf
. Mon noyau est 3.16.0-77-generic
.
Maintenant, je vais installer gcc
, compiler un programme de test, et essayer de l'exécuter sous perf record
.
apt-get install -y gcc
Je coller dans le programme de test en 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);
}
}
}
compilez Ensuite, exécutez et signaler: gcc -g -O0 test.c && perf record ./a.out && perf report
La sortie ressemble à ceci: 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
Cela n'a pas de symboles, même si l'exécutable a symbo l information.
Faire les mêmes étapes générales à l'extérieur du récipient fonctionne très bien, et montre quelque chose comme ceci: 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
Dans le système hôte, je l'ai déjà tourné sur les symboles du noyau en devenant racine et faire: echo 0 > /proc/sys/kernel/kptr_restrict
Comment faire pour que la version conteneurisée fonctionne correctement et affiche les symboles de débogage?
Merci, c'était exactement cela. Pour ajouter à la solution, afin d'obtenir les symboles du noyau, vous devez également ajouter: '--kallsyms =/proc/kallsyms'. –
Au cas où cela aiderait quelqu'un d'autre: un moyen encore plus simple est d'appeler 'docker run' avec' -v/var/lib/docker /:/var/lib/docker', ce qui fait que 'perf' ne nécessite aucune arguments spéciaux pour résoudre correctement les symboles. –
Ah, c'est un bon. –