связь между виртуальной памятью и дампом ядра

У меня есть исполняемый файл и gcore.

Я создал файл дампа ядра с помощью gcore.

Теперь я хотел бы отобразить виртуальный адрес исполняемого файла в дамп ядра.

Я знаю, что дамп ядра — это дамп памяти исполняемого файла, и если я хочу проанализировать виртуальный адрес из дампа ядра. Могу ли я предположить, что виртуальный адрес 0x0000 равно смещению 0x0000 основной дамп?

5

Решение

Я знаю, что дамп ядра — это дамп памяти исполняемого файла,

Нет. Дамп ядра в gdb (gcore указывает, что вы используете это) обычно в формате ELF, так что есть обширный заголовок, определяющий, что соответствует чему.

Я не совсем уверен, насколько широко GDB / linux использует искажение адресного пространства при выгрузке ядер, но вы не можете предполагать, что смещение файла x будет отображаться в смещении памяти x — потому что виртуальное адресное пространство может охватывать огромный адресное пространство, из которого он использует только несколько страниц. (Например, 64-битный процесс может иметь виртуальное адресное пространство, которое намного больше, чем ваш жесткий диск, хотя он может иметь только зарезервированную память, которая гораздо меньше, и даже из-за этого не все страницы должны быть фактически выделены).

Однако GDB может читать эти заголовки, и если вы попросите его напечатать что-либо (например, используя print или же x команда), это даст вам правильную вещь.

Если вы хотите прочитать файл дампа основной памяти, то правильное решение — использовать возможности GDB для этого. К счастью, есть libgdb, который делает именно это для вашего приложения C / C ++. По сути, это позволяет вам общаться с GDB, как если бы вы были пользователем, сидящим перед оболочкой GDB. Следовательно, выясните, как делать то, что вы хотите в GDB, а затем используйте libgdb, чтобы сделать это программно.

Если вы хотите сделать это на низком уровне (не делайте этого, это хлопотно, и GDB действительно то, что вы хотите использовать, на самом деле), вы можете напрямую использовать Библиотека дескрипторов двоичных файлов проанализировать и представить дамп ядра. Это неотъемлемая часть GDB, и будет трудно заставить ее работать с вашей собственной программой на C ++ без повторной реализации большого количества подпрограмм GDB.

3

Другие решения


По вопросам рекламы [email protected]