Как отслеживать поведение каждого потока многопоточной (pthread) программы C ++ в Linux? - PullRequest
1 голос
/ 26 января 2012

Я использую многопоточную (pthread) программу на C ++ в Linux (redhat).

Я хочу следить за поведением работающей программы, но распечатки из потоков чередуются друг с другом.Трудно выяснить поведение каждого потока.

Я хочу использовать DDD (графический интерфейс gdb) для анализа поведения программы, но для этого требуется «мотив», когда я устанавливаю «мотив», который имеет ошибку:

cc -c -O -I ../../ include -I ../../ import / x11 / include / X11 ./ccimake imake.c imake.c: 162: 21: ошибка: Xosdefs.h: такого файла нетили каталог

Я также использовал инструменты helgrind и drd, но есть много текстовой распечатки, что приводит к путанице в поведении каждого потока.

Не могли бы вы порекомендовать лучшие инструменты с открытым исходным кодом, которые помогут мне четко и легко выполнять отладку и анализировать / отслеживать поведение нескольких потоков.

Можно ли показать каждый поток в отдельном окне терминала xterm без смешения всех потоков вместе?

спасибо

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Стандартные функции печати, такие как printf, не являются поточно-ориентированными. Если вы входите в stdout или в отдельный файл, вам нужно рассматривать свои функции ведения журнала как критическую секцию и защищать их с помощью мьютекса. В противном случае ваш журнал может быть чередован или не в порядке.

В качестве альтернативы вы можете позволить каждому потоку создавать свой собственный файл журнала, записывать имя / идентификатор потока и временную метку в каждый файл и «привязывать» эти файлы журнала к отдельным терминалам.

0 голосов
/ 26 января 2012
  • Обязательно используйте printf для печати, тогда по крайней мере строки будут напечатаны без изменений
  • Убедитесь, что каждая нить использует префикс, например [MainThread] Log message...
  • Directвывод в файл: your_program > logfile.txt
  • Для каждого потока выполните: tail -f logfile.txt | grep <thread_prefix>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...