Comments 33
Я благодаря strace выяснил, почему в моём дебьяне по минуте открывался диалог сохранения файлов — висело изза сломаных прав на dbus
Хотелось бы узнать подробностей! :)
всё просто, я запускал диалог командой kdialog --getopenurl.
не успел дописать
он зависал на минуту-две при открытии, точно так же висел и dolphin
тогда я запустил strace kdialog --getopenurl. 2> out.log и после открытия диалога пролистал лог на наличие слова timeout
висело, если я не ошибаюсь вот тут
connect(14, {sa_family=AF_FILE, path="/var/run/dbus/system_bus_socket"}, 33) = 0
он зависал на минуту-две при открытии, точно так же висел и dolphin
тогда я запустил strace kdialog --getopenurl. 2> out.log и после открытия диалога пролистал лог на наличие слова timeout
висело, если я не ошибаюсь вот тут
connect(14, {sa_family=AF_FILE, path="/var/run/dbus/system_bus_socket"}, 33) = 0
Полезная статья. Утилитка тоже выручала когда пытался подружить пых с mssql через FreeTDS.
К слову для MacOSX есть dtruss
К слову для MacOSX есть dtruss
«Наверное нет того человека, который бы не слышал про strace»
Наверное есть.
Наверное есть.
добавил описание и пару ссылок.
Присоединяюсь.
Услышал впервые (не столь давно стал пользователем *nix систем, но поверхностно уже разбираюсь). Утилита очень интересная и предлагает, как понимаю, очень большой функционал отладки и нахождения проблем в работе приложений и системы.
Спасибо автору =)
Услышал впервые (не столь давно стал пользователем *nix систем, но поверхностно уже разбираюсь). Утилита очень интересная и предлагает, как понимаю, очень большой функционал отладки и нахождения проблем в работе приложений и системы.
Спасибо автору =)
Я хотел около года назад написать похожую статью, но только не целиком про strace(ktrace/kdump под FreeBSD), а ещё про дополнительные полезные утилиты.
От себя в копилку: иногда клиентские сайты очень надолго зависали, причём на конкретную величину (30 или около того секунд).
Проблема была в том, что в коде у них содержалось обращение к внешнему серверу, который в этот момент лежал.
Выглядело это как зависший read после открытия сетевого соединения.
От себя в копилку: иногда клиентские сайты очень надолго зависали, причём на конкретную величину (30 или около того секунд).
Проблема была в том, что в коде у них содержалось обращение к внешнему серверу, который в этот момент лежал.
Выглядело это как зависший read после открытия сетевого соединения.
Ну открывать удаленный url из процесса, который рендерит вам html-страницу — это вообще довольно плохой стиль. Для этого существуют асинхронные очереди / воркеры / WebSocket'ы
Привет битриксу, например :) Или создателям тем и плагинов для вордпресса.
Расскажите это PayPal'у, сообщающему вам номер совершённой транзакции, но требующий дополнительного обращения к себе, вместо отправки подписанного подтверждения post'ом, или OAuth провайдерам. WebSocket'ы то тут вообще при чём?
Для отладки PHP приложений лучше вооружиться профайлером.
Для фри есть же православный dtrace, зачем кусать кактус?
Было бы неплохо дать хотя бы краткое введение — что показывает strace. Если судить по подаче текста, так просто панацея получается, хотя это далеко не так. Это я к тому, что «для тех, кто знает» что такое strace тут мало нового, а для тех, кто не знает — мало понятного =)
Спасибо за статью, я сегодня тоже узнал про утилиту впервые.
Смотря вот на эти 2 строчки не понял как определить, что одна из них выдает ошибку:
Я привык даже визуально парсить логи на наличие слов типа ERROR. Тут что ошибку выдает? -1 или фраза «Cannot allocate memory»?
Смотря вот на эти 2 строчки не понял как определить, что одна из них выдает ошибку:
open("/dev/vhost-net", O_RDWR) = -1 ENOMEM (Cannot allocate memory)
write(2, «qemu-system-x86_64:», 19qemu-system-x86_64:) = 19
Я привык даже визуально парсить логи на наличие слов типа ERROR. Тут что ошибку выдает? -1 или фраза «Cannot allocate memory»?
ENOMEM errno enum жи
= -1 — это возвращенное функцией open значение. Согласно документации результат < 0 — ошибка (смотреть надо в документацию на функцию).
ENOMEM — значение переменной errno.
Cannot allocate memory — текстовая расшифровка кода ошибки ENOMEM.
strace — это не отладчик, это трассировщик системных вызовов, по этому он ничего не знает ошибка это или так задумано, по этому не может написать ERROR или более заметное сообщение, но информацию о результате работы системных вызовов, в том числе и завершившихся ошибкой он выдает.
ENOMEM — значение переменной errno.
Cannot allocate memory — текстовая расшифровка кода ошибки ENOMEM.
strace — это не отладчик, это трассировщик системных вызовов, по этому он ничего не знает ошибка это или так задумано, по этому не может написать ERROR или более заметное сообщение, но информацию о результате работы системных вызовов, в том числе и завершившихся ошибкой он выдает.
А я в своё время с помощью strace разобрался как patch -p пользоваться. :(
В своё время пытался понять, почему древняя Linux-версия rar не принимает ключ. strace позволил узнать, что rar ищет его где-то в /etc/rarreg.*, ~/rarreg.*, ~/.rarreg.*. Пытался размещать соответственно. А потом немного подумал и понял, что open(/etc/rarreg.*) не будет раскрывать звёздочку, и переименовал файл ключа из rarreg.key в rarreg.*. Это решило проблему.
Спасибо. Благодаря статье наконец взялся выяснить почему у меня xfrun4 5 секунд запускается. Оказалось тривиально:
И дальше сразу же нашёл баг. Не знаю сколько бы я ещё избегал использования xfrun4 без статьи… :)
Скрытый текст
sendmsg(6, {msg_name(0)=NULL, msg_iov(2)=[{"l\1\0\1\t\0\0\0\3\0\0\0\200\0\0\0\1\1o\0\23\0\0\0/org/xfc"..., 144}, {"\0\0\0\0\0\0\0\0\0", 9}], msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 15 3 poll([{fd=6, events=POLLIN}], 1, 5000) = 0 (Timeout)
И дальше сразу же нашёл баг. Не знаю сколько бы я ещё избегал использования xfrun4 без статьи… :)
Хочу предостеречь новичков.
Если вы используете Unix (например, FreeBSD), а не Linux, то лучше пользоваться ktrace: последний ведёт отладку на уровне ядра системы и не использует системный вызов ptrace для подключения к процессу.
Были случаи когда strace/truss валил программу при подключении или сам зависал (ведь используется переключение контекста на приложение).
К сожалению, в Linux-системах нет аналога ktrace.
Что касается статьи, а именно, части про PostgreSQL:
НЕ делать DISCARD ALL в pgbouncer'е — как-то очень дико. Этот параметр должен быть включен всегда, ибо read only — не самое страшное что может сделать клиент в рамках сессии.
Если вы используете Unix (например, FreeBSD), а не Linux, то лучше пользоваться ktrace: последний ведёт отладку на уровне ядра системы и не использует системный вызов ptrace для подключения к процессу.
Были случаи когда strace/truss валил программу при подключении или сам зависал (ведь используется переключение контекста на приложение).
К сожалению, в Linux-системах нет аналога ktrace.
Что касается статьи, а именно, части про PostgreSQL:
НЕ делать DISCARD ALL в pgbouncer'е — как-то очень дико. Этот параметр должен быть включен всегда, ибо read only — не самое страшное что может сделать клиент в рамках сессии.
О perf не слышали? Мощнейший инструмент.
Скрытый текст
$ sudo perf record -a -g ./src/stress --cpu 4 --io 2 --vm 2 --timeout 10s
$ sudo perf report -g
# ========
# captured on: Fri Mar 14 04:12:21 2014
# hostname : ######
# os release : 3.12-1-amd64
# perf version : 3.12.6
# arch : x86_64
# nrcpus online : 8
# nrcpus avail : 8
# cpudesc : #################
# cpuid : ###########
# total memory : #########
# cmdline : /usr/bin/perf_3.12 record -a -g ./src/stress --cpu 4 --io 2 --vm 2 --timeout 10s
# event : name = cycles, type = 0, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0, attr_mmap2 = 0, attr_mmap = 1, attr_mmap_data = 0
# HEADER_CPU_TOPOLOGY info available, use -I to display
# HEADER_NUMA_TOPOLOGY info available, use -I to display
# pmu mappings: cpu = 4, software = 1, tracepoint = 2, breakpoint = 5
# ========
#
# Samples: 241K of event 'cycles'
# Event count (approx.): 221562887737
#
# Overhead Command Shared Object Symbol
# ........ ............. .................. .............................................
#
30.28% stress libc-2.18.so [.] __random_r
|
--- __random_r
19.70% stress libc-2.18.so [.] __random
|
--- __random
8.41% stress stress [.] hogcpu
|
--- hogcpu
5.94% stress [kernel.kallsyms] [k] page_fault
|
--- page_fault
hogvm
5.05% stress libc-2.18.so [.] rand
|
--- rand
4.84% stress [kernel.kallsyms] [k] clear_page_c_e
|
--- clear_page_c_e
hogvm
4.23% stress stress [.] hogvm
|
--- hogvm
2.74% stress stress [.] rand@plt
|
--- rand@plt
1.90% stress [kernel.kallsyms] [k] get_page_from_freelist
|
--- get_page_from_freelist
...
Честно говоря, вроде не слышал. :) Но понял, что во FreeBSD есть аналог — pmcstat из PmcTools.
Но ведь это профайлеры, а не трассировщики системных вызовов.
Но ведь это профайлеры, а не трассировщики системных вызовов.
вот как раз потихоньку колупаю perf, мне нравится, пока нашел для него применение в целях определения тех мест в которых проводит свое время процесс (и сколько времени проводит).
про DISCARD ALL. Не скажу точно где (толи pgsql-hackers, толи pgsql-performance), но проскакивало что DISCARD ALL добавляет вполне ощутимый оверхед. Померять руки не дотянулись, но тем дядькам я вобщем доверяю. Да и вроде как время кривых orm прошло уже)))
спасибо. Не знал про такое. Взял на вооружение.
Sign up to leave a comment.
Strace