Ceci est impossible avec Kprobes parce que, comme vous l'avez dit, malloc
n'est pas un appel système. Vous pouvez toutefois utiliser les USDT pour suivre les processus de l'espace utilisateur. Vous pouvez cependant utiliser les USDT. The bcc tools contiennent un exemple avec uobjnew
. Il trace les allocations d'objets dans le processus donné:
$ ./uobjnew -h
usage: uobjnew.py [-h] [-l {java,ruby,c}] [-C TOP_COUNT] [-S TOP_SIZE] [-v]
pid [interval]
Summarize object allocations in high-level languages.
positional arguments:
pid process id to attach to
interval print every specified number of seconds
optional arguments:
-h, --help show this help message and exit
-l {java,ruby,c}, --language {java,ruby,c}
language to trace
-C TOP_COUNT, --top-count TOP_COUNT
number of most frequently allocated types to print
-S TOP_SIZE, --top-size TOP_SIZE
number of largest types by allocated bytes to print
-v, --verbose verbose mode: print the BPF program (for debugging
purposes)
examples:
./uobjnew -l java 145 # summarize Java allocations in process 145
./uobjnew -l c 2020 1 # grab malloc() sizes and print every second
./uobjnew -l ruby 6712 -C 10 # top 10 Ruby types by number of allocations
./uobjnew -l ruby 6712 -S 10 # top 10 Ruby types by total size
'malloc' n'est pas un appel système. Dans la bibliothèque GNU Glibc, il est implémenté en utilisant les appels système 'mmap' et' sbrk'. Peut-être que vous voulez utiliser 'valgrind' sur votre application utilisateur .... Le noyau lui-même alloue de la mémoire dynamique (à l'intérieur du noyau, pas pour les applications) en utilisant' kmalloc' et les fonctions du noyau associées. –
Et vous pouvez aussi utiliser 'pmap' et, pour le processus de pid 1234, regarder dans/proc/1234/status' et'/proc/1234/maps' etc ... –