Вот фрагмент файла / proc / self / smaps :
00af8000-00b14000 r-xp 00000000 fd:00 16417 /lib/ld-2.8.so
Size: 112 kB
Rss: 88 kB
Pss: 1 kB
Shared_Clean: 88 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 88 kB
Swap: 0 kB
00b14000-00b15000 r--p 0001c000 fd:00 16417 /lib/ld-2.8.so
Size: 4 kB
Rss: 4 kB
Pss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
Referenced: 4 kB
Swap: 0 kB
Это показывает, что этот процесс (self) связан с / lib / ld-2.8.so и двумя (из множества) диапазонами байтов, отображенными в памяти.
Первый диапазон 88 КБ (22 страницы по 4 КБ) - общий и чистый , то есть он не был записан. Это, вероятно, код.
Второй диапазон 4 КБ (одна страница) не является общим, и он грязный - процесс записал в него, так как он был отображен в памяти из файла на диске. Это, вероятно, данные.
Но что в этой памяти?
Как преобразовать диапазон памяти 00b14000-00b15000 в полезную информацию, такую как номер строки файла, в котором объявлена большая статическая структура?
Метод должен учитывать предварительную связь и рандомизацию адресного пространства , например, execshield , а также отдельные символы отладки .
(Мотивация - определить популярные библиотеки, которые также создают грязную память, и исправить их, например, объявив структуры const).