Комментарии 33
Я благодаря strace выяснил, почему в моём дебьяне по минуте открывался диалог сохранения файлов — висело изза сломаных прав на dbus
+1
Хотелось бы узнать подробностей! :)
0
всё просто, я запускал диалог командой kdialog --getopenurl.
0
не успел дописать
он зависал на минуту-две при открытии, точно так же висел и 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
0
Полезная статья. Утилитка тоже выручала когда пытался подружить пых с mssql через FreeTDS.
К слову для MacOSX есть dtruss
К слову для MacOSX есть dtruss
+1
«Наверное нет того человека, который бы не слышал про strace»
Наверное есть.
Наверное есть.
+31
добавил описание и пару ссылок.
+1
Присоединяюсь.
Услышал впервые (не столь давно стал пользователем *nix систем, но поверхностно уже разбираюсь). Утилита очень интересная и предлагает, как понимаю, очень большой функционал отладки и нахождения проблем в работе приложений и системы.
Спасибо автору =)
Услышал впервые (не столь давно стал пользователем *nix систем, но поверхностно уже разбираюсь). Утилита очень интересная и предлагает, как понимаю, очень большой функционал отладки и нахождения проблем в работе приложений и системы.
Спасибо автору =)
+1
НЛО прилетело и опубликовало эту надпись здесь
Я хотел около года назад написать похожую статью, но только не целиком про strace(ktrace/kdump под FreeBSD), а ещё про дополнительные полезные утилиты.
От себя в копилку: иногда клиентские сайты очень надолго зависали, причём на конкретную величину (30 или около того секунд).
Проблема была в том, что в коде у них содержалось обращение к внешнему серверу, который в этот момент лежал.
Выглядело это как зависший read после открытия сетевого соединения.
От себя в копилку: иногда клиентские сайты очень надолго зависали, причём на конкретную величину (30 или около того секунд).
Проблема была в том, что в коде у них содержалось обращение к внешнему серверу, который в этот момент лежал.
Выглядело это как зависший read после открытия сетевого соединения.
+2
Ну открывать удаленный url из процесса, который рендерит вам html-страницу — это вообще довольно плохой стиль. Для этого существуют асинхронные очереди / воркеры / WebSocket'ы
0
Привет битриксу, например :) Или создателям тем и плагинов для вордпресса.
0
Расскажите это PayPal'у, сообщающему вам номер совершённой транзакции, но требующий дополнительного обращения к себе, вместо отправки подписанного подтверждения post'ом, или OAuth провайдерам. WebSocket'ы то тут вообще при чём?
0
Для отладки PHP приложений лучше вооружиться профайлером.
0
Для фри есть же православный dtrace, зачем кусать кактус?
0
Было бы неплохо дать хотя бы краткое введение — что показывает strace. Если судить по подаче текста, так просто панацея получается, хотя это далеко не так. Это я к тому, что «для тех, кто знает» что такое strace тут мало нового, а для тех, кто не знает — мало понятного =)
+5
Спасибо за статью, я сегодня тоже узнал про утилиту впервые.
Смотря вот на эти 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»?
0
ENOMEM errno enum жи
+1
= -1 — это возвращенное функцией open значение. Согласно документации результат < 0 — ошибка (смотреть надо в документацию на функцию).
ENOMEM — значение переменной errno.
Cannot allocate memory — текстовая расшифровка кода ошибки ENOMEM.
strace — это не отладчик, это трассировщик системных вызовов, по этому он ничего не знает ошибка это или так задумано, по этому не может написать ERROR или более заметное сообщение, но информацию о результате работы системных вызовов, в том числе и завершившихся ошибкой он выдает.
ENOMEM — значение переменной errno.
Cannot allocate memory — текстовая расшифровка кода ошибки ENOMEM.
strace — это не отладчик, это трассировщик системных вызовов, по этому он ничего не знает ошибка это или так задумано, по этому не может написать ERROR или более заметное сообщение, но информацию о результате работы системных вызовов, в том числе и завершившихся ошибкой он выдает.
+4
А я в своё время с помощью strace разобрался как patch -p пользоваться. :(
+3
В своё время пытался понять, почему древняя Linux-версия rar не принимает ключ. strace позволил узнать, что rar ищет его где-то в /etc/rarreg.*, ~/rarreg.*, ~/.rarreg.*. Пытался размещать соответственно. А потом немного подумал и понял, что open(/etc/rarreg.*) не будет раскрывать звёздочку, и переименовал файл ключа из rarreg.key в rarreg.*. Это решило проблему.
+6
Спасибо. Благодаря статье наконец взялся выяснить почему у меня 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 без статьи… :)
0
Хочу предостеречь новичков.
Если вы используете 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 — не самое страшное что может сделать клиент в рамках сессии.
0
О 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
...
+1
Честно говоря, вроде не слышал. :) Но понял, что во FreeBSD есть аналог — pmcstat из PmcTools.
Но ведь это профайлеры, а не трассировщики системных вызовов.
Но ведь это профайлеры, а не трассировщики системных вызовов.
0
вот как раз потихоньку колупаю perf, мне нравится, пока нашел для него применение в целях определения тех мест в которых проводит свое время процесс (и сколько времени проводит).
0
про DISCARD ALL. Не скажу точно где (толи pgsql-hackers, толи pgsql-performance), но проскакивало что DISCARD ALL добавляет вполне ощутимый оверхед. Померять руки не дотянулись, но тем дядькам я вобщем доверяю. Да и вроде как время кривых orm прошло уже)))
0
спасибо. Не знал про такое. Взял на вооружение.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Strace