[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Разработка программ с несколькими нитями, которые проверяют и изменяют объекты из библиотеки phread

Библиотека отладки 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().

Функции callback

Библиотека отладки 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.

Создание программ с несколькими нитями


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]