Включить сегменты разделяемых библиотек только для чтения в дамп ядра, созданный GDB gcore - PullRequest
1 голос
/ 03 марта 2020

Я использовал 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 не выгрузил его ???

...