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

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

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

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


person Jeremy Friesner    schedule 18.07.2014    source источник


Ответы (1)


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

person Chris Dodd    schedule 18.07.2014