Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как сбросить кучу запущенного процесса C++ в файл под Linux?

Автор вопроса: Jeremy FriesnerОтветов: 1

У меня есть программа, которая работает на безголовой/встроенной Linux-системе, и при определенных обстоятельствах эта программа, похоже, использует немного больше памяти (как сообщается сверху и т. д.), чем я ожидал.

Поскольку состояние ошибки трудно воспроизвести вне реальной рабочей среды, и поскольку встроенный блок не имеет таких тонкостей, как valgrind или gdb, я хотел бы просто записать кучевую память процесса в файл , который я мог бы затем перенести на свою машину для разработки и просмотреть на досуге, чтобы увидеть, могу ли я сказать по содержимому файла, какие именно данные занимают большую часть кучи. Если мне повезет, может быть дымящийся пистолет, такой как повторяющаяся строка или магическое число, которое появляется много раз и указывает мне на место в моем коде, которое либо дает утечку, либо, возможно, просто безгранично увеличивает структуру данных.

Есть ли хороший способ сделать это? Единственный способ, который я могу придумать, - это принудительно завершить процесс, а затем собрать дамп ядра, но, поскольку состояние ошибки встречается редко, было бы предпочтительнее, если бы я мог собирать информацию без сбоя процесса как побочный эффект.

linuxdebuggingheap

Ответы

Ответ 1 · рейтинг 3 · Chris Dodd

Вы можете прочитать все пространство памяти процесса через /proc/pid/mem; Вы можете прочитать /proc/pid/maps, чтобы увидеть, что где находится в пространстве памяти (так что вы можете найти границы кучи и прочитать только это). Вы можете попытаться прочитать данные во время выполнения процесса (в этом случае они могут измениться, пока вы их читаете), или вы можете остановить процесс с помощью сигнала SIGSTOP, а затем возобновить его с помощью сигнала SIGCONT.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы