Tuesday, 4 August 2009

core dump

Я думаю многие люди видели сообщения:

segmentation fault

и любой программист знает, что без core файла понять что там было будет сложно. Собственно я хочу рассказать про «корки».

Core dump файл (иногда просто core, а часто «корка») — это образ памяти процесса на момент получения сигнала, например SIGSEGV.

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

  • ulimit — за возможность записи core файла отвечает soft limit RLIMIT_CORE. Для его установки можно использовать:

    • setrlimit — непосредственно с процесса, во время работы, если eiud 0 или есть capability CAP_SYS_RESOURCE;
    • ulimit -c — RLIMIT_CORE наследуется от процесса, который запустил новый прцоесс. Соответсвенно в shell человек может сказать ulimit -c unlimited или ulimit -c 123456. Для просмотра текущего лимита можно использовать просто ulimit -c;
    • /etc/security/limits.conf — у каждого дистрибутива своя политика безопасности и свои limit по умолчанию. Если нужно разрешить запись core файлов для сервисов, который стартуют на уровне системы, то, возможно, надо будет вносить изменения в /etc/security/limits.conf. Важно понимать, что если администратор скажет /etc/init.d/services restart то сервис унаследует limit пользователя, из под которого работает администратор.
  • /proc/sys/fs/suid_dumpable — измение uid для core файлов:

    • 0 (по умолчанию) — создает core файлы с uid/gid как у процесса, на момент создания.
    • 1 — core файл создается с uid/gid как у binnary из которого стартовала программа.
    • 2 — тоже самое что 0, только прочесть этот файл сможет только root.
  • /proc/sys/kernel/core_pattern — изменение шаблона для имени файлов. По умолчанию просто . Все пути в шаблоне имени будут относительно текущей директории у процесса. Но всегда можно задать полный путь, от корня. Доступные макросы:

    • %% — собственно символ %;
    • %p — PID процесса, из которого делается core;
    • %u — числовой реальный UID процесса;
    • %g — числовой реальный GID процесса;
    • %s — номер сигнала, который вызвал создания core;
    • %t — время создания файла;
    • %h — имя хоста;
    • %e — имя запущенного файла;
    • %c — RLIMIT_CORE у этого процесса.

    Если первый символ |, то core будет передан на STDIN программы, которая будет запущена от именни root. Можно использовать аргументы командной строки и макросы.

  • /proc/sys/kernel/core_uses_pid — если не 0, то добавляется .%p после конца core_pattern, если там нет макроса %p.

  • /proc/$PID/coredump_filter — какие части памяти будут помещаться в core файл:

    • 0 бит — анонимная память;
    • 1 бит — анонимная общая память;
    • 2 бит — отображенные в память файлы;
    • 3 бит — отображенные в общую память файлы;

    по умолчанию в core попадает только анонимная память.

  • prctl(PR_SET_DUMPABLE) — если программа делает setuid или setgid, флаг dumpable скидывается. Если /proc/sys/fs/suid_dumpable не 1, то программа не сможет записать core до тех пор, пока не будет поставлен этот флаг в 1.

Если нужно создать core с живого процесса, то можно воспользоваться программой gcore. Или использовать gdb и команду generate-core-file.

Write on: 17:43 | 2 comments | | tags: , , , | permalink |
Add post to:   Delicious Reddit Slashdot Digg Technorati Google


Add comment

Comments

mikhail 7.08.2009 2:32

если администратор скажет /etc/init.d/services restart то сервис унаследует limit пользователя, из под которого работает администратор”

Что-то я немного не понял, как работают лимиты. Если, допустим, апач запускается от пользователя apache и у него прописаны какие-то лимиты в /etc/security/limits.conf то после перезапуска от рута через /etc/init.d/apache2 restart эти ограничения для него сбросятся?

reply

Comment form for «core dump»

Required. 30 chars of fewer.

Required.

Kirill A. Korinskiy 7.08.2009 14:39

Давай я отдельным постом расскажу подробнее про лимиты в этой чудной системе, ага?

reply