получение информации о потоках в GDB / DDD - PullRequest
2 голосов
/ 14 января 2011

Я отлаживаю многопоточное приложение, используя ddd.

В то же время каждую секунду я вижу на консоли DDD , что создается новый поток

 [NewThread 0x455fc940 (LWP 27373)]

и уничтожено сразу после него.

 [Thread 0x455fc940  (LWP 27373) exited]

Через несколько минут у меня есть этот текст

 [NewThread 0x455fc940 (LWP 27363)]
 [Thread 0x455fc940  (LWP 27363) exited]
 [NewThread 0x455fc940 (LWP 27367)]
 [Thread 0x455fc940  (LWP 27367) exited]
 [NewThread 0x455fc940 (LWP 27373)]
 [Thread 0x455fc940  (LWP 27373) exited]
 ...and so on..

с увеличением LWP.

Трассы приходят и уходят слишком быстро, чтобы отображаться в окне, которое я получил, щелкнув Статус-> Тема. Не могли бы вы немного рассказать мне, как получить информацию об этой теме?

Знаете ли вы, почему этот LWP все время увеличивается? Более важно, как получить функцию, которая запускается в этот поток?

Спасибо всем AFG

Ответы [ 2 ]

6 голосов
/ 14 января 2011

LWP является аббревиатурой и означает легкий процесс. В действительности это идентификатор потока каждого вновь созданного потока.

Что делать с этими порождающимися и умирающими потоками: вы можете попытаться установить точку останова на clone, то есть системный вызов («я прав?»), Который запускает новый поток для данной функции.

Примечание: при разрыве на clone вы знаете, откуда поток будет запущен, но на самом деле потока нет, однако вы можете затем установить точки останова для функций, заданных в качестве аргумента clone ...

То есть, запустите вашу программу из gdb или ddd с помощью команды start, которая устанавливает временную точку останова в точке входа программы (т. Е. main), а затем устанавливает точку останова на clone, продолжайте и посмотрим что получится;).

Обновление : установка точки останова на clone работает для меня ... по крайней мере, в моем тесте. Я должен добавить, что это специфично для Linux - и это то, что pthread_create использует.

2 голосов
/ 14 января 2011

Установите точку останова в pthread_create.

(gdb) break pthread_create
Breakpoint 1 at 0x20c49ba5cabf44

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

...