Вторник, 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»