Распечатать или проверить значение счетчика семафоров в GDB

Я пытаюсь реализовать пул потоков, используя библиотеку ACE Semaphore. Он не предоставляет никаких API, как sem_getvalue который находится в семафоре Posix. Мне нужно отладить некоторый поток, который не ведет себя, как ожидалось. Могу ли я изучить семафор в GDB. Я использую Centos в качестве ОС.

Я инициализировал два семафора, используя конструктор по умолчанию, обеспечивающий количество 0 и 10. Я объявил их как статические в классе и инициализировал их в файле cpp как

DP_Semaphore ThreadPool::availableThreads(10);
DP_Semaphore ThreadPool::availableWork(0);

Но когда я печатаю семафор в GDB, используя print команда, я получаю похожий вывод

(gdb) p this->availableWork
$7 = {
sema = {
semaphore_ = {
sema_ = 0x6fe5a0,
name_ = 0x0
},
removed_ = false
}
}
(gdb) p this->availableThreads
$8 = {
sema = {
semaphore_ = {
sema_ = 0x6fe570,
name_ = 0x0
},
removed_ = false
}
}

Есть ли инструмент, который может помочь мне здесь, или я должен переключиться на поток Posix и переписать весь мой код.

РЕДАКТИРОВАТЬ: В соответствии с запросом @timrau вывод вызова this->availableWork->dump()

(gdb) p this->availableWork.dump()
[Switching to Thread 0x2aaaae97e940 (LWP 28609)]
The program stopped in another thread while making a function call from GDB.
Evaluation of the expression containing the function
(DP_Semaphore::dump()) will be abandoned.
When the function is done executing, GDB will silently stop.
(gdb) call this->availableWork.dump()
[Switching to Thread 0x2aaaaf37f940 (LWP 28612)]
The program stopped in another thread while making a function call from GDB.
Evaluation of the expression containing the function
(DP_Semaphore::dump()) will be abandoned.
When the function is done executing, GDB will silently stop.
(gdb) info threads
[New Thread 0x2aaaafd80940 (LWP 28613)]
6 Thread 0x2aaaafd80940 (LWP 28613)  0x00002aaaac10a61e in __lll_lock_wait_private ()
from /lib64/libpthread.so.0
* 5 Thread 0x2aaaaf37f940 (LWP 28612)  ThreadPool::fetchWork (this=0x78fef0, worker=0x2aaaaf37f038)
at ../../CallManager/src/DP_CallControlTask.cpp:1043
4 Thread 0x2aaaae97e940 (LWP 28609)  DP_Semaphore::dump (this=0x6e1460) at ../../Common/src/DP_Semaphore.cpp:21
2 Thread 0x2aaaad57c940 (LWP 28607)  0x00002aaaabe01ff3 in __find_specmb () from /lib64/libc.so.6
1 Thread 0x2aaaacb7b070 (LWP 28604)  0x00002aaaac1027c0 in __nptl_create_event () from /lib64/libpthread.so.0
(gdb)

0

Решение

sema.semaphore_.sema_ в вашем коде выглядит как указатель. Попробуйте найти его тип в заголовках ACE, затем преобразуйте его в тип и напечатайте:

(gdb) p *((sem_t)0x6fe570)

Обновление: попробуйте преобразовать адрес в структуре, которую вы разместили, в sem_t. Если вы используете Linux, ACE должен использовать семафоры posix, поэтому тип sem_t должен быть виден для gdb.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector