#c #linux #multithreading
#c #linux #многопоточность
Вопрос:
Я не нашел ни одного инструмента, созданного для отслеживания потоков pthread в процессе Linux. Я хочу что-то вроде strace / ltrace, есть ли что-нибудь для просмотра вызовов в режиме реального времени? Спасибо
Ответ №1:
strace работает и для потоков. Используется strace -f
для упорядочивания всех потоков.
Чтобы упорядочить только определенный поток, вам сначала нужно найти его tid (идентификатор потока). Потоки имеют идентификаторы потоков, которые на самом деле являются pid (идентификатором процесса)
Как только вы узнаете pid потока, используйте strace -p the_pid
для упорядочивания этого потока.
PID всех потоков в процессе можно найти в /proc/<pid>/task/
, или текущий идентификатор потока можно узнать с gettid()
помощью вызова C.
Комментарии:
1. вау, большое вам спасибо, я сотни раз видел помощь strace, но не думал, что «follow forks» покажет потоки
2. Это не работает (для меня, во всяком случае). Чтобы быть более конкретным, я использую strace -f -p <pid> для подключения потока, который я хочу просмотреть. Всякий раз, когда он принимает новое соединение с сокетом, он создает pthread для его обработки, но strace вообще не выполняет вызов pthread_create в новый поток.
Ответ №2:
на самом деле strace не так хорош, как perf .
используйте perf tool, вы можете получить больше информации.
например, если какой-то из ваших потоков зависает, и вы хотите выяснить, какие функции вызывают зависания, используйте strace -p pid-id возвращает ограниченную информацию, но perf top или perf -t tid возвращает больше