Pull to refresh

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
Полезная статья. Утилитка тоже выручала когда пытался подружить пых с mssql через FreeTDS.

К слову для MacOSX есть dtruss
Apple честно лицензировал всю технологию dtrace у сана уже достаточно давно.
«Наверное нет того человека, который бы не слышал про strace»
Наверное есть.
добавил описание и пару ссылок.
Присоединяюсь.
Услышал впервые (не столь давно стал пользователем *nix систем, но поверхностно уже разбираюсь). Утилита очень интересная и предлагает, как понимаю, очень большой функционал отладки и нахождения проблем в работе приложений и системы.
Спасибо автору =)
функционал-то как раз не очень большой )

Просто выводит исполняемые системные вызовы программы и результат их работы.
А вот что делать с этой информацией — вопрос опыта или умения пользоваться поисковиком. :)
UFO just landed and posted this here
Я хотел около года назад написать похожую статью, но только не целиком про strace(ktrace/kdump под FreeBSD), а ещё про дополнительные полезные утилиты.

От себя в копилку: иногда клиентские сайты очень надолго зависали, причём на конкретную величину (30 или около того секунд).

Проблема была в том, что в коде у них содержалось обращение к внешнему серверу, который в этот момент лежал.

Выглядело это как зависший read после открытия сетевого соединения.
Ну открывать удаленный url из процесса, который рендерит вам html-страницу — это вообще довольно плохой стиль. Для этого существуют асинхронные очереди / воркеры / WebSocket'ы
Привет битриксу, например :) Или создателям тем и плагинов для вордпресса.
Расскажите это PayPal'у, сообщающему вам номер совершённой транзакции, но требующий дополнительного обращения к себе, вместо отправки подписанного подтверждения post'ом, или OAuth провайдерам. WebSocket'ы то тут вообще при чём?
Для отладки PHP приложений лучше вооружиться профайлером.
Это-то конечно, но не думаю что хорошо включать профайлер на сервере хостинга для всех клиентов, верно?
depends что за профайлер [и когда включать, и какой сервер]. Я тут, вот, о Pinba слышал (только не хочу серверную часть на MySQL)
Для фри есть же православный dtrace, зачем кусать кактус?
Было бы неплохо дать хотя бы краткое введение — что показывает strace. Если судить по подаче текста, так просто панацея получается, хотя это далеко не так. Это я к тому, что «для тех, кто знает» что такое strace тут мало нового, а для тех, кто не знает — мало понятного =)
Спасибо за статью, я сегодня тоже узнал про утилиту впервые.
Смотря вот на эти 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»?
= -1 — это возвращенное функцией open значение. Согласно документации результат < 0 — ошибка (смотреть надо в документацию на функцию).
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 секунд запускается. Оказалось тривиально:
Скрытый текст
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 — не самое страшное что может сделать клиент в рамках сессии.
О 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.

Articles

Change theme settings