Вторник, 4 Август 2009
core dump
Я думаю многие люди видели сообщения:
segmentation fault
и любой программист знает, что без core файла понять что там было будет сложно. Собственно я хочу рассказать про «корки».
Core dump файл (иногда просто core, а часто «корка») — это образ памяти процесса на момент получения сигнала, например SIGSEGV
.
Теперь поехали про ручки, за которые можно подергать, чтобы файл писался по разному.
ulimit — за возможность записи core файла отвечает
soft limit RLIMIT_CORE
. Для его установки можно использовать:setrlimit
— непосредственно с процесса, во время работы, если eiud 0 или есть capabilityCAP_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.
- 0 (по умолчанию) — создает
/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
.
Комментарии
Что-то я немного не понял, как работают лимиты. Если, допустим, апач запускается от пользователя apache и у него прописаны какие-то лимиты в
/etc/security/limits.conf
то после перезапуска от рута через/etc/init.d/apache2 restart
эти ограничения для него сбросятся?Давай я отдельным постом расскажу подробнее про лимиты в этой чудной системе, ага?
Форма комментирования для «core dump»