Отладка приложений


         

и поэтому перенесена на следующие


TID Ret Addr C/R Ret Value Function & Params 

0x000000F? [Ox004011AC] (R) 0x00000000 InitializeCriticalSection

0x00403110

 0x000000F7 [0x00401106] (R) 0x00000290 CreateEventA 0x00000000, 1, 0,

0x004030F0 [The event name] 

0x000000F? [Ox004011E9] (R) 0x00000294 CreateThread 0x00000000,

0x00000000, 0x00401000,

0x00000000, 0x00000000,

0x0012FF68 

0x000000F7 [0x0040120C] (R) 0x00000298 CreateThread 0x00000000,

0x00000000, 0x004010BC,

0x00000000, 0x00000000,

0x0012FF68

0x000000FV [0x00401223] (C) EnterCriticalSection 0x00403110 

0x000000F7 [0x00401223] (R) 0x00000000 EnterCriticalSection 0x00403110 0x000000F? [0x00401238] (C) WaitForSingleObject 0x00000290,

INFINITE

0x000000FF [Oxl020B973] (C) EnterCriticalSection 0xl025CE90

 0x000000FF [Oxl020B973] (R) 0x00000000 EnterCriticalSection 0xl025CE90

 0x00000l0C [Ox004010F3] (R) 0x000002A4 OpenEventA 0x001F0003, 0,

0x004030BC

[The event name]

Заметьте, что информация о функции и параметрах (в столбце Function & Params) в листинге 12-1 не поместилась в одной строке и поэтому перенесена на следующие строки (в этом же столбце). Информация выводится на экран в следующем порядке:

1. Идентификатор (ID) выполняющегося потока.

2. Адрес возврата, указывающий, какая из ваших функций вызвала функцию синхронизации. Используя утилиту CrashFinder, рассмотренную в главе 8, можно просмотреть адреса возвратов и узнать, как вы входили в ситуации блокировки.

3. Индикатор вызова/возврата (Call/Return — C/R), помогающий идентифицировать действия, которые происходят до и после конкретной функции.

4. Возвращаемое значение функции, если программа возвращает функции отчетов.

5. Имя функции синхронизации.

6. Список параметров функции синхронизации. В квадратных скобках указаны данные, поясняющие некоторые значения. Я ограничился здесь показом строчных значений, но можно также добавлять такие данные, как индивидуальные флажки.

Если запускаемое приложение блокируется, то для того чтобы увидеть последний вызванный элемент синхронизации, аннулируйте процесс и просмотрите файл вывода.TEXTFILEDDEXT.DLL сохраняет последнее файловое обновление, сбрасывая буферы файлов каждый раз, когда вызываются функции WaitFor*, EnterCriticalSection И TryEnterCriticalSection.

Предостережение

Если включить полную регистрацию (всех функций), то можно довольно долго генерировать чрезвычайно большой файл. Используя Visual С++-приложение MTGDI, я генерировал текстовый файл объемом в 11 Мбайт за одну или две минуты, если создавал пару потоков.



Содержание  Назад  Вперед