Получить программную информацию о потоках, используя gdb и pthreads - PullRequest
3 голосов
/ 13 июля 2011

Используя gdb, я могу набрать 'info threads' или 'thread apply all backtrace', чтобы получить список всех моих потоков и того, что они делают.

Я хотел бы написать макрос gdb, которыйвместо этого перечислит все запущенные темы.Этот макрос извлекает номер потока (т. Е. Аргумент команды gdb 'thread'), а затем получает имя потока, которое я определил и хранит в локальном хранилище потока.

В псевдокоде этобудет выглядеть примерно так:

for each thread in threads
    t thread
    f 1
    set $name = my_name
    f top
    printf "Thread %d has name %s and is currently doing %s\n", thread, $name, curr_frame
next

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

У меня есть список потоков в моей программе, и для него я могу получить pthread_t, который соответствует указателю потока, отображаемому как часть вывода 'info thread':

(gdb) info thread
....
30 Thread 0x5221c940 (LWP 25304)  0x00000031c5a0aee9 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
....
(gdb) p *(_thread_t*)my_threads[0].pid
$4 = {
  t_id = 0x5221c940,

Как вы можете видеть, член t_id совпадает с адресом потока в выводе, но я не могу найти какой-либо способ воспользоваться программным преимуществом этого факта.

Кто-нибудь знает способ сделатьэто?

1 Ответ

2 голосов
/ 13 июля 2011

Начиная с версии 7.0, GDB поддерживает скрипты на python, так что вы можете в значительной степени реализовать свой псевдокод как есть.См. Документацию для доступа к потокам здесь и для получения кадра стека здесь .

Я думаю, что проще всего написать свою программу в файле source.py, а затем запуститьв ГБД:

source source.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...