Я использовал gdb для создания файла дампа ядра с gcore и использовал дамп в символьном c исполнении. Однако я обнаружил, что в память не включены сегменты, доступные только для чтения, например, загруженная библиотека libc.so.6
. К сожалению, он мне нужен для выполнения символов c.
Есть ли способ сделать дамп ядра также включающим эти сегменты только для чтения?
РЕДАКТИРОВАТЬ:
Я изменил значение в / proc // coredump_filter на 0x3 c, чтобы разрешить: " Dump file-backed shared mappings"
в соответствии с core (5) . Однако gcore
теперь выдает десятки предупреждений:
warning: Memory read failed for corefile section, 1048576 bytes at xxxxxx
, где xxxxxx - это примерно область памяти, в которой разделяемые библиотеки (включая lib c, et c.) Находятся в памяти. Однако я хочу, чтобы основной файл содержал общие библиотеки.
Что не так?
ps: Я могу читать из областей памяти общих библиотек внутри GDB обычным способом с помощью простой команды GDB x /16i
.
РЕДАКТИРОВАТЬ:
Я также проверил /proc/<pid>/smaps
, внутри которого, например, область памяти libc
имеет вид:
7f65930f8000-7f65932df000 r-xp 00000000 08:01 789499 /lib/x86_64-linux-gnu/libc-2.27.so
Size: 1948 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 836 kB
Pss: 82 kB
Shared_Clean: 836 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 836 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
VmFlags: rd ex mr mw me sd
Я предполагаю, что значение по умолчанию 0x33 в coredump_filter
должно быть достаточным для сброса этой области. Кроме того, поскольку флаги виртуальных машин не включают dd (do not include area into core dump)
, запись в основной файл не была предотвращена, но почему gcore
не выгрузил его ???