Библиотека отладки pthread (libpthdebug.a) содержит набор функций, позволяющих разработчикам программ проверять и изменять объекты из библиотеки pthread.
Эта библиотека применяется как для 32-разрядных, так и для 64-разрядных приложений. Эта библиотека обеспечивает защиту нитей. Библиотека отладки pthread содержит как 32-разрядные, так и 64-разрядные объекты.
Библиотека отладки pthread предоставляет приложениям доступ к информации из библиотеки pthread. В число этой информации входят сведения о нитях, их атрибутах, взаимных блокировках, атрибутах блокировок, условных переменных, атрибутах условных переменных, блокировках чтения и записи, атрибутах этих блокировок, а также сведения о состоянии библиотеки pthread.
Примечание: Все данные (адреса и регистры), возвращаемые функциями библиотеки, представлены в 64-разрядном формате как для 64-разрядных, так и для 32-разрядных приложений. Преобразование значений в 32- или 64-разрядный формат должны выполнять приложения. При отладке 32-разрядных приложений старшие 32 разряда адреса или регистра игнорируются.
Примечание: Библиотека отладки pthread не сообщает сведения о нитях, их атрибутах, взаимных блокировках, атрибутах блокировок, условных переменных, атрибутах условных переменных, блокировках чтения и записи и атрибутах этих блокировок, значение pshared которых равно PTHREAD_PROCESS_SHARED.
Приложение должно инициализировать сеанс библиотеки отладки pthread для каждого процесса pthreaded. После загрузки каждого процесса pthreaded необходимо вызывать функцию pthdb_sessison_init(). Библиотека отладки pthread поддерживает для каждого процесса один сеанс. Приложение должно присвоить уникальный идентификатор пользователя и передать его функции pthdb_session_init(), которая присвоит уникальный идентификатор сеанса, передаваемый в качестве первого параметра всем остальным функциям библиотека отладки pthread, за исключением pthdb_session_pthreaded(). Когда библиотека отладки pthread вызывает функцию callback, она передает приложению уникальный идентификатор пользователя. Функция pthdb_session_init() проверяет список функций callback (Функции callback для работы с несколькими нитями), предоставленный приложением, и инициализирует структуры данных сеанса. Кроме того, эта функция устанавливает флаги сеанса. Приложение должно передать флаг PTHDB_FLAG_SUSPEND функции pthdb_session_init . Полный список флагов приведен в описании функции pthdb_session_setflags().
Библиотека отладки pthread применяет функции callback для получения данных, записи данных и управления памятью приложений. Более подробная информация приведена в разделе Функции callback (Функции callback для работы с несколькими нитями).
Для приложения требуются следующие функции callback:
Приложением могут применяться следующие функции callback:
Каждый раз, когда приложение останавливается после инициализации сеанса, необходимо вызывать функцию pthdb_session_update(). Эта функция устанавливает и обновляет списки нитей, атрибутов нитей, взаимных блокировок, атрибутов взаимных блокировок, переменных условия, атрибутов переменных условия, блокировок чтения/записи, атрибутов блокировок чтения/записи, ключей отдельных нитей и активных ключей. Память для списков выделяется с помощью функций callback.
Функция pthdb_pthread_context() считывает контекст, а функция pthdb_pthread_setcontext() устанавливает контекст. Функция pthdb_pthread_context() считывает контекст пользовательской нити из структуры данных нити ядра или пользовательской нити. Эта структура данных расположена в адресном пространстве приложения. Если пользовательская нить не связана с нитью ядра, информация о контексте считывается из библиотеки нитей. Если пользовательская нить связана с нитью ядра, эта информация считывается из приложения с помощью функций callback. При этом приложение должно определить, находится ли нить ядра в режиме ядра или в пользовательском режиме, и выдать информацию для соответствующего режима.
Если пользовательская нить связана в нитью ядра, находящейся в режиме ядра, невозможно считать полную информацию о контексте для пользовательского режима, так как ядро хранит ее компоненты в разных местах. Для считывания неполной информации можно вызвать функцию getthrds(). Она всегда сохраняет стек пользовательского режима. Приложение может получить доступ к этой информации, проверив значение thrdsinfo64.ti_scount. Если это значение отлично от нуля, стек пользовательского режима находится в thrdsinfo64.ti_ustk. С помощью стека пользовательского режима можно определить iar и страницы функций callback, но нельзя узнать значения других регистров. Определение структуры thrdsinfo64 содержится в файле procinfo.h.
Библиотека отладки нитей управляет списками нитей, атрибутов нитей, взаимных блокировок, атрибутов взаимных блокировок, переменных условия, атрибутов переменных условия, блокировок чтения/записи, атрибутов блокировок чтения/записи, ключей отдельных нитей и активных ключей, представленных в виде описателей соответствующих типов. Функции pthdb_<object>() возвращают следующий дескриптор из списка объектов: pthread, attr, mutex, mutexattr, cond, condattr, rwlock, rwlockattr и key. Если список пуст или достигнут конец списка, возвращается значение PTHDB_INVALID_<OBJECT>, где OBJECT - это один из следующих объектов: PTHREAD, ATTR, MUTEX, MUTEXATTR, COND, CONDATTR, RWLOCK, RWLOCKATTR или KEY.
Дополнительную информацию об объекте можно получить с помощью соответствующего метода объекта с именем pthdb_<объект>_<поле>(), где объект может принимать одно из следующих значений: pthread, attr, mutex, mutexattr, cond, condattr, rwlock, rwlockattr или key, а поле - имя поля данных объекта.
Функция pthdb_session_setflags() позволяет приложению изменить флаги для настройки сеанса. Эти флаги предназначены для изменения числа регистров, которые считываются или записываются при выполнении операций с контекстом.
Функция pthdb_session_flags() возвращает текущие значения флагов сеанса.
В конце сеанса необходимо освободить память, занятую структурами данных сеанса, и удалить сами данные. Эти действия выполняет функция pthdb_session_destroy(), причем для освобождения памяти она использует функцию callback. Освобождается вся память, выделенная функциями pthdb_session_init() и pthdb_session_update().
Пример
Пример кода, показывающий, как приложение может подключиться к библиотеке отладки pthread:
/* директивы include */ #include <pthread.h> #include <sys/pthdebug.h> ... int my_read_data(pthdb_user_t user, pthdb_symbol_t symbols[],int count) { int rc; rc=memcpy(buf,(void *)addr,len); if (rc==NULL) { fprintf(stderr,"Сообщение об ошибке\n"); return(1); } return(0); } int my_alloc(pthdb_user_t user, size_t len, void **bufp) { *bufp=malloc(len); if(!*bufp) { fprintf(stderr,"Сообщение об ошибке\n"); return(1); } return(0); } int my_realloc(pthdb_user_t user, void *buf, size_t len, void **bufp) { *bufp=realloc(buf,len); if(!*bufp) { fprintf(stderr,"Сообщение об ошибке\n"); return(1); } return(0); } int my_dealloc(pthdb_user_t user,void *buf) { free(buf); return(0); } status() { pthdb_callbacks_t callbacks = { NULL, my_read_data, NULL, NULL, NULL, my_alloc, my_realloc, my_dealloc, NULL }; ... rc=pthread_suspend_others_np(); if (rc!=0) обработка ошибок if (not initialized) rc=pthdb_session_init(user,exec_mode,PTHDB_SUSPEND|PTHDB_REGS,callbacks, &session); if (rc!=PTHDB_SUCCESS) обработка ошибок rc=pthdb_session_update(session); if (rc!=PTHDB_SUCCESS) обработка ошибок получить информацию об объекте pthread с помощью функций списка и функций обработки полей ... rc=pthread_continue_others_np(); if (rc!=0) обработка ошибок } ... main() { ... }
Файл pthread.h.
Создание программ с несколькими нитями