7

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

В Windows можно создать «мини-дамп» запущенной программы несколькими различными способами, включая ADVPlus и диспетчер задач Windows, перейдя на вкладку "Процессы" и щелкнув правой кнопкой мыши и выбрав "Создать файл дампа".

Есть ли способ сделать это в Linux?

Мне нужны стеки вызовов, куча и память стека (особенно стека), исключения и все остальное.

4 ответа4

11

Ну, способ создать файл дампа:

   gcore - Generate a core file for a running process

ОПИСАНИЕ gcore [-o имя_файла] pid

7
pmap <PID>

или же

strace -f -o xxx -p <PID> 

может быть инструменты, которые вы ищете.

pmap показывает вам обзор использования памяти предоставленным процессом. strace отслеживает каждое действие, предпринимаемое процессом. С -f вы указываете strace также рассмотреть возможность наблюдения за дочерними процессами, а -o xxx указывает strace записать вывод в файл. Вы также можете начать новый процесс, используя strace, например, с

strace cat /etc/passwd

Если вас интересует только конкретная информация, например, какие файлы были открыты, вы можете запустить strace соответственно:

strace -f -o xxx -e trace=open -p <PID>
4

Попробуй это:

cat /proc/<pid>/smaps > mem.txt

Эта ссылка также может помочь вам.

1

Между тем, ProcDump из пакета Sysinternals также был доступен под очень либеральной лицензией MIT на соответствующей странице GitHub.

Usage: procdump [OPTIONS...] TARGET
   OPTIONS
      -C          CPU threshold at which to create a dump of the process from 0 to 100 * nCPU
      -c          CPU threshold below which to create a dump of the process from 0 to 100 * nCPU
      -M          Memory commit threshold in MB at which to create a dump
      -m          Trigger when memory commit drops below specified MB value.
      -n          Number of dumps to write before exiting
      -s          Consecutive seconds before dump is written (default is 10)
   TARGET must be exactly one of these:
      -p          pid of the process

Таким образом, как вы можете вывести из аргументов командной строки, легко сделать "моментальные снимки" процесса, который, как вы знаете, ведет себя неправильно, потребляя чрезмерное количество ресурсов для последующего анализа с помощью gdb или около того.

Однако этот ProcDump для Linux не является полным по сравнению с его двоюродным братом Windows.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .