2 votes

Mécanisme utilisé pour déterminer l'adresse de chargement de la bibliothèque dans Perf

Comment les perf déterminer les adresses de chargement pour chaque image chargée (par exemple, les bibliothèques partagées) au cours du post-traitement. Par exemple, perf report utilise ces informations pour que l'adresse de chaque symbole soit relative au début de chaque image chargée. C'est ce que montre l'image ci-dessous ( unwind: _int_malloc... ): enter image description here

Est-il stocké quelque part dans le elf la sortie binaire ou de profilage (c.-à-d., perf.data ) ?

4voto

osgx Points 28675

L'adresse de chargement des bibliothèques partagées est stockée dans le fichier perf.data enregistré au cours de la phase d'exécution du projet. perf record commande. Vous pouvez utiliser la commande perf script -D pour extraire les données de perf.data dans un format partiellement décodé. Lorsque votre programme est chargé par ld-linux*.so.2 (ou si nécessaire avec dlopen), le chargeur recherchera la bibliothèque et chargera ses segments à l'aide de la fonction mmap syscall. Ces événements mmap sont enregistrés par le noyau et ont le type PERF_RECORD_MMAP ou PERF_RECORD_MMAP2 dans le fichier perf.data. Et perf report (et perf script ) reconstruira les décalages de mémoire pour décoder les noms de symboles.

$ perf record  echo 1
$ perf script -D|grep MMAP -c
7
$ perf script -D|less
PERF_RECORD_MMAP2 ... r-xp /bin/echo
...
PERF_RECORD_MMAP2 ... r-xp /lib/x86_64-linux-gnu/libc-2.27.so

Idées de base perf sont décrits dans https://github.com/torvalds/linux/blob/master/tools/perf/design.txt fichier. Pour commencer le profilage, il y a perf_event_open syscall qui a perf_event_attr *attr argument. Page de manuel décrit les champs de l'attr liés à la mémoire tampon :

   The perf_event_attr structure provides detailed configuration
   information for the event being created.

                 mmap           : 1,   /* include mmap data */
                 mmap_data      : 1,   /* non-exec mmap data */
                 mmap2          :  1,  /* include mmap with inode data */

Le noyau Linux dans son perf_events (kernel/events) enregistrera les événements requis pour les processus profilés et exportera les données avec fd et mmap vers le profileur. perf record déverse généralement ces données du noyau dans le fichier perf.data sans traitement lourd (vérifiez les impressions "Woken up 1 times to write data" de votre fichier perf record sortie). Les événements Mmap dans le noyau sont enregistrés par perf_event_mmap_output appelé par perf_event_mmap_event qui est appelé à partir de perf_event_mmap . Mise en œuvre de l'appel sélectif mmap dans mm/mmap.c a des appels inconditionnels à perf_event_mmap .

Le design.txt de perf mentionne munmap, mais la mise en œuvre actuelle n'a pas de champ ou d'événement munmap, le code d'événement 2 a été réutilisé pour PERF_RECORD_LOST . Des idées ont été émises quant à l'utilité de munmap. https://www.spinics.net/lists/netdev/msg524414.html avec des liens vers https://lkml.org/lkml/2016/12/10/1 y https://lkml.org/lkml/2017/1/27/452

L'outil perf fait partie des sources du noyau linux et peut être consulté en ligne sur le site LXR/elixir : https://elixir.bootlin.com/linux/v5.4/source/tools/perf/ Le code de traitement des événements mmap/mmap2 se trouve dans perf/util/machine.c machine__process_mmap_event y machine__process_mmap2_event Les arguments mmap enregistrés, l'adresse renvoyée, le décalage et le nom du fichier sont enregistrés à l'aide de la fonction map__new y thread__insert_map pour le processus (pid/tid) et utilisé ultérieurement pour convertir l'adresse de l'événement échantillon en nom de symbole.

PS : Votre perf.data a une taille de plus de 300 MB, ce qui est énorme et le traitement peut être lent. Pour les programmes de longue durée, vous pouvez réduire la fréquence d'échantillonnage des événements de l'enregistrement de perf avec -F freq option de perf record : perf record -F40 ou avec -c opción.

2voto

Peter Cordes Points 1375

Vous ne pouvez pas le trouver simplement en regardant l'exécutable ELF et les bibliothèques. Il peut varier à chaque exécution ; même si ASLR a été désactivé par perf comme le fait GDB, un programme peut utiliser mmap(MAP_FIXED) avant de l'utiliser dlopen d'une bibliothèque optionnelle qui n'est chargée que plus tard, de sorte que dlopen devrait choisir une adresse différente de l'adresse habituelle pour mapper une bibliothèque. (La liaison dynamique normale a lieu avant que main s'exécute, non pas via dlopen, mais vraisemblablement perf veut pouvoir enregistrer les correspondances adresses -> fichiers pour toute correspondance adossée à un fichier).

Probablement, perf enregistre l'adresse de base d'exécution de chaque objet ELF dans le fichier perf.data

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X