Очень базовый c подход: вы можете попробовать посмотреть, кто звонит mmap
(а не munmap
).
- присоединиться к процессу
- set точка останова на
mmap
, с командами для печати аргументов и обратной трассировки (может быть, 5 кадров) и продолжения - аналогичная вещь для
munmap
- перенаправления вывода
- , чтобы он работал для день
- отсоединение
- совпадение
mmap
с с munmap
с на выходе
При pmap
, периодически работающем на стороне, вы можете быть возможность сопоставлять новые аноновые области с mmap
обратными следами (возможно, потребуется поиграться с количеством кадров).
Уже есть эта хорошая небольшая статья LINUX GDB: ОПРЕДЕЛИТЬ УТЕЧКИ ПАМЯТИ чтобы начать.
Примечание:
- вы ищете
mmap
и munmap
, а не malloc
и free
- вы нужно будет узнать смещение возврата от
mmap
- Я не пробовал сценарий из статьи, но я думаю, что он будет делать то, что статья
Нахождение mmap
смещения инструкции возврата (с начала mmap
): просто запустите gdb
с любым исполняемым файлом на том же хосте
[ aquila ~ ] $ gdb -q /usr/bin/ls
Reading symbols from /usr/bin/ls...Reading symbols from /usr/bin/ls...(no debugging symbols found)...done
.
(no debugging symbols found)...done.
Missing separate debuginfos, use: dnf debuginfo-install coreutils-8.27-5.fc26.x86_64
(gdb) set pagination off
(gdb) set breakpoint pending on
(gdb) b mmap
Function "mmap" not defined.
Breakpoint 1 (mmap) pending.
(gdb) r
Starting program: /usr/bin/ls
Breakpoint 1, 0x00007ffff7df2940 in mmap64 () from /lib64/ld-linux-x86-64.so.2
(gdb) disassemble
Dump of assembler code for function mmap64:
=> 0x00007ffff7df2940 <+0>: test %rdi,%rdi
0x00007ffff7df2943 <+3>: push %r15
0x00007ffff7df2945 <+5>: mov %r9,%r15
:
:
0x00007ffff7df2973 <+51>: mov $0x9,%eax
:
0x00007ffff7df2982 <+66>: pop %rbx
:
0x00007ffff7df298a <+74>: pop %r15
0x00007ffff7df298c <+76>: retq
0x00007ffff7df298d <+77>: nopl (%rax)
:
:
0x00007ffff7df29d8 <+152>: mov $0xffffffffffffffff,%rax
0x00007ffff7df29df <+159>: jmp 0x7ffff7df2982 <mmap64+66>
End of assembler dump.
Обратите внимание на инструкция возврата здесь:
0x00007ffff7df298c <+76>: retq
Итак, на моем компьютере вторая точка останова должна быть установлена на (mmap + 76).
Как только вы определите это смещение, вы можете проверить это смещение путем присоединения к целевому процессу и разборки того, что находится на этом смещении. Например, принимая мою текущую оболочку в качестве целевого процесса:
[ aquila ~ ] $ echo $$
9769
[ aquila ~ ] $ gdb -q
(gdb) attach 9769
Attaching to process 9769
Reading symbols from /usr/bin/bash...Reading symbols from /usr/bin/bash...(no debugging symbols found)..
.done.
(no debugging symbols found)...done.
Reading symbols from /lib64/libtinfo.so.6...Reading symbols from /lib64/libtinfo.so.6...(no debugging sy
mbols found)...done.
(no debugging symbols found)...done.
Reading symbols from /lib64/libdl.so.2...(no debugging symbols found)...done.
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Reading symbols from /lib64/libnss_files.so.2...(no debugging symbols found)...done.
0x00007fcfc67cc18a in waitpid () from /lib64/libc.so.6
Missing separate debuginfos, use: dnf debuginfo-install bash-4.4.12-5.fc26.x86_64
(gdb) x/i mmap+76
0x7fcfc680375c <mmap64+76>: retq
Я не очень уверен, что hbreak
требуется, простой старый break
может также работать.