22.04.2016 Некоторые методы отладки

Материал из SRNS
Перейти к: навигация, поиск

Содержание

Вылов segfault'ов в gdb

Запускаем программу через gdb

>> gdb ./receiver

В командной строке gdb пишем "run"

>> run

Ждём возникновения segfault'a

 

Пишем "backtace", видим место возникновения ошибки.

>> backtrace

Смотрим стек вызовов, выбираем нужную функцию

>> backtrace

Просматриваем внутренние переменные (в Oryx не работает)

>> print i


Как посмотреть, что делает уже запущенный процесс с помощью strace

Процесс запущен, консоль не доступна.

Смотрим PID

>> ps ax | grep receiver

Вызываем strace, смотрим вызовы:

>> strace -p <PID>
write(1, "main_facq  0  tms 383466821   0 "..., 40) = 40
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
write(1, "main_facq  0  tms 383466831   0 "..., 40) = 40
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x5c898, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)

Как посмотреть, что выводится в stdout в уже запущенном процессе

Процесс запущен, консоль не доступна.

Смотрим PID

>> ps ax | grep receiver

Вызываем strace, смотрим вызовы: Процесс запущен, консоль не доступна.

Смотрим PID

>> strace -p <PID> -e write
write(1, "main_facq  0  tms 384016831   0 "..., 40) = 40
write(1, "main_facq  0  tms 384016831   0 "..., 40) = 40
write(1, "main_facq  0  tms 384016842   0 "..., 40) = 40
write(1, "main_facq  0  tms 384016842   0 "..., 40) = 40

Просмотр потоков с помощью htop

Программа htop позволяет выдавать кучу информации.

20160422 htop 1.png

Кстати, из списка видно, что запущено два экземпляра receiver. Один работает, другой - нет.

Однако по-умолчанию она не выводит названия потоков внутри процесса. Нужно войти в настройки, нажав F2, и во вкладке "Display options" установить следующее состояние:

20160422 htop 2.png

Также можно менять состав данных в столбцах, в частности, вывести номер используемого процессорного ядра:

20160422 htop 3.png

Вот здесь программа подвисла на обработке входного потока протокола srns.

20160422 htop 4.png


[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.

Персональные инструменты
Пространства имён

Варианты
Действия
SRNS Wiki
Рабочие журналы
Приватный файлсервер
QNAP Сервер
Инструменты