Как сделать обратную трассировку в Windows

    From The Document Foundation Wiki

    Введение

    LibreOffice, как всё программное обеспечение, может "зависать" или аварийно завершать работу, когда работает на операционной системе Windows. В таком прискорбном случае, некоторые данные отладки могут быть собраны пользователем и представлены команде разработчиков LibreOffice так, чтобы они смогли исправить ошибку. Сбор этих данных называется обратной трассировкой и его можно прикрепить к отчету об ошибке в Bugzilla. Если вы являетесь пользователем LibreOffice 4.2.0 или выше, эта статья проведёт вас шаг за шагом через процесс получения журнала обратной трассировки в Windows, используя инструмента для отладки WinDbg.

    Первая установка

    Установка WinDbg
    1. Установите WinDbg используя Standalone Debugging Tools for Windows
      • Пользователям Windows 7 и 8
        Для корректной работы у вас должен быть предустановлен .NET Framework 4.5 redistributable. Убедитесь что он у вас есть. Затем скачайте Windows SDK for Windows 8.1 (прямая ссылка) и во время установки, снимите все флажки кроме Debugging Tools for Windows.
      • Пользователям Windows XP и Vista
        Для корректной работы у вас должен быть предустановлен .NET 4.0 или .NET 3.5 SP1. Убедитесь что он у вас есть. Затем скачайте Windows SDK for .NET 4.0 или .NET 3.5 SP1 и во время установки, снимите все флажки кроме Debugging Tools for Windows.
      • Примечания к установке
        Для установки вам потребуются права администратора. Если вы получаете сообщение об ошибке во время установки, то скорее всего вам нужно удалить Visual C++ 2010 Redistributable из вашей системы.
    2. Привязка отладочных символов к утилите для отладки
      WinDbg в меню Пуск
      • Используя WinDbg
        Запустите WinDbg из меню Пуск системы Windows. Она находится в папке Debugging Tools for Windows.
        Примечания: Если эта папка отсутствует, запустите установку утилит по новой, щёлкните Change и затем, снимите и поставьте заново флажок Debugging Tools for Windows, и продолжите установку.

        Как только вы откроете WinDbg, пройдите в меню File ▸ Symbol File Path... и вставьте следующий код в поле:
        CACHE*C:\symbols;SRV*http://dev-downloads.libreoffice.org/symstore/symbols;SRV*http://msdl.microsoft.com/download/symbols
        Как вариант, если вы хотите одновременно заниматься отладкой стандартной сборки и сборки из ветки master (Win-x86@39 tinderbox), вставьте следующий код:
        CACHE*C:\symbols;SRV*https://dev-builds.libreoffice.org/daily/master/Win-x86@39/symbols;SRV*http://dev-downloads.libreoffice.org/symstore/symbols;SRV*http://msdl.microsoft.com/download/symbols
        Adding Symbols
        Нажмите Ok и выберите в меню File ▸ Save workspace для окончательной настройки путей отладочных символов.
      • Используя Visual Studio
        Обратная трассировка может быть сделана в Visual Studio Express 2005 или более поздней версии. Откройте Tools ▸ Options ▸ Debugging ▸ Symbols и добавьте нижеприведённые URL.
        https://dev-builds.libreoffice.org/daily/master/Win-x86@39/symbols
        http://dev-downloads.libreoffice.org/symstore/symbols

    Отладка

    Для начала отладки, запустите WinDbg и LibreOffice. Скриншоты помогающие понять этот процесс находятся в конце этого раздела.

    В WinDbg нажмите F6 или пройдите в меню File ▸ Attach to a Process.... В появившемся диалоговом окне выберите soffice.bin из списка имён файлов (если вы запустили LibreOfficeон последним, он обычно последний в списке). После того, как вы нажмете кнопку OK, в окне появиться серия строк, последняя из которых будет содержать int 3.

    Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
    Copyright (c) Microsoft Corporation. All rights reserved.
    *** wait with pending attach
    Symbol search path is: c:\lodev\symbols;SRV*c:\Symbols\mssymbols\*http://msdl.microsoft.com/download/symbols
    Executable search path is: 
    ModLoad: 01280000 0132a000   C:\Program Files (x86)\LOdev 3.5\program\soffice.bin
    [...]
    ModLoad: 5f520000 5fa4d000   C:\Program Files (x86)\LOdev 3.5\program\xolo.dll
    (13b8.d64): Break instruction exception - code 80000003 (first chance)
    eax=7efaf000 ebx=00000000 ecx=00000000 edx=77d7f85a esi=00000000 edi=00000000
    eip=77cf000c esp=08d3fa30 ebp=08d3fa5c iopl=0         nv up ei pl zr na pe nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
    ntdll!DbgBreakPoint:
    77cf000c cc              int     3
    

    Вы увидите мигающий текстовый курсор в поле команды. На данный момент, вы можете либо нажать F5, либо пройти в меню Debug ▸ Go, либо ввести символ g и нажмите клавишу ↵ Enter, после этого начнётся отладка. Как только отладка началась, поле команды станет серым и в нём будет написано Debuggee is running..., со словом *BUSY* в поле слева.

    Теперь переключитесь на LibreOffice и попытаться воспроизвести ошибку, которая приводит к зависанию или аварийному завершению программы. Если вам удалось воспроизвести ошибку, переключитесь обратно WinDbg. Вы увидите, что было напечатано ряд строк в окне, последние из которых, как правило, будут иметь номер вопросительные знаки в конце.

    0:011> g
    ModLoad: 05950000 05bfc000   C:\Program Files (x86)\LOdev 3.5\program\fwklo.dll
    ModLoad: 05950000 05bfc000   C:\Program Files (x86)\LOdev 3.5\program\fwklo.dll
    (13b8.dd8): C++ EH exception - code e06d7363 (first chance) 
    [...]
    ModLoad: 74a30000 74a36000   C:\Windows\SysWOW64\sensapi.dll
    (13b8.dd8): Access violation - code c0000005 (first chance)
    First chance exceptions are reported before any exception handling.
    This exception may be expected and handled.
    eax=9162b873 ebx=00000000 ecx=9162b873 edx=9162b873 esi=602ff600 edi=00000000
    eip=6623b085 esp=00bec8fc ebp=00bec908 iopl=0         nv up ei ng nz na po nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010282
    sal3!rtl_uString_newFromAscii+0x15:
    6623b085 0fbe11          movsx   edx,byte ptr [ecx]         ds:002b:9162b873=???????
    

    Вы заметите, что поле команда снова стало белым. Введите в поле !analyze -v и нажмите ↵ Enter. WinDbg будет начать анализ исключений, и вы снова увидите *BUSY*. Будьте терпеливы и дождитесь окончания процесса.

    0:000> !analyze -v
    *******************************************************************************
    *                                                                             *
    *                        Exception Analysis                                   *
    *                                                                             *
    *******************************************************************************
    FAULTING_IP: 
    sal3!rtl_uString_newFromAscii+15 [c:\lodev\source\sal\rtl\source\ustring.cxx @ 437]
    6623b085 0fbe11          movsx   edx,byte ptr [ecx]
    EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
    ExceptionAddress: 6623b085 (sal3!rtl_uString_newFromAscii+0x00000015)
       ExceptionCode: c0000005 (Access violation)
      ExceptionFlags: 00000000
    NumberParameters: 2
       Parameter[0]: 00000000
       Parameter[1]: 9162b873
    [...]
    SYMBOL_NAME:  soffice.bin
    FOLLOWUP_NAME:  MachineOwner
    MODULE_NAME: soffice
    DEBUG_FLR_IMAGE_TIMESTAMP:  5358065d
    STACK_COMMAND:  ** Pseudo Context ** ; kb
    FAILURE_BUCKET_ID:  STACKIMMUNE_c0000005_C:_Program Files_(8x6)_LibreOffice_program_soffice.bin!Unknown
    BUCKET_ID:  X64_APPLICATION_FAULT_STACKIMMUNE_NOSOS_INVALID_POINTER_WRITE_ZEROED_STACK_soffice.bin
    WATSON_IBUCKET:  219952521
    WATSON_IBUCKETTABLE:  17
    IMAGE_NAME:  C:\Program Files (x86)\LibreOffice\program\soffice.bin
    WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/soffice_bin/4_2_4_2/5358065d/ntdll_dll/.../000222d2.htm?Retriage=1
    Followup: MachineOwner
    ---------
    

    После того, как анализ исключение завершена, *BUSY* исчезнет, и вы сможете выделить выведенный текст. Выделите весь текст с самого начала анализа исключений и до конца. Скопируйте текст, нажав Ctrl + C, выбрав в меню Edit ▸ Copy или просто щелкнуть правой кнопкой мыши.

    Теперь откройте Блокнот из меню Пуск и вставьте текст в пустой документ, нажимая Ctrl + V или через меню Edit ▸ Paste, или щелкните правой кнопкой мыши Paste. Сохраните файл с помощью Ctrl + S или File ▸ Save и назовите файл backtrace.txt.

    Так как LibreOffice еще заблокирован WinDbg, вам нужно закрыть WinDbg: нажмите Alt + F4 или в меню File ▸ Exit. Если появится диалоговое окно с просьбой "Save information for workspace?", выберите No. Это закроет как WinDbg, так и LibreOffice.

    Скриншоты отладки в WinDbg

    Шаг 1 - Меню File
    Шаг 2 - Выбор soffice.bin
    Шаг 3 - Готовность к вводу данных
    Шаг 4 - Запуск отладки
    Шаг 5 - Завершение отладки
    Шаг 6 - Завершение анализа
    Шаг 7 - Копирование анализа

    Создание мини-дампа

    Иногда WinDbg не может поймать исключение LO должным образом. В этом случае мы должны создать мини-дамп, который затем можно загрузить и разобрать в отладчике. Для получения такого дампа можно использовать бесплатную утилиту ProcDump следующим образом.

    Убедитесь, что ваша LibreOffice отладочная сборка работает.

    В командной строке Windows введите:

    d:\procdump4.01>procdump.exe soffice.bin -h
    

    Воспроизведите ошибку.

    Когда будет обнаружено что окно LibreOffice зависло, ProcDump проинформирует о создании успешного мини-дампа.

    d:\procdump4.01>procdump.exe soffice.bin -h
    ProcDump v4.0 - Writes process dump files
    Copyright (C) 2009-2011 Mark Russinovich
    Sysinternals - www.sysinternals.com
    Process:               soffice.bin (1964)
    CPU threshold:         n/a
    Performance counter:   n/a
    Commit threshold:      n/a
    Threshold seconds:     n/a
    Number of dumps:       1
    Hung window check:     Enabled
    Exception monitor:     Disabled
    Terminate monitor:     Disabled
    Dump file:             d:\procdump4.01\soffice.dmp
    [09:02.39] Hung window detected.
    Writing dump file d:\procdump4.01\soffice_120614_090239.dmp ...
    Dump written.
    Dump count reached.
    d:\procdump4.01>
    

    Откройте WinDbg и загрузите в него файл .dmp (File ▸ Open Crash Dump...).

    Loading Dump File [D:\soffice_120601_075839.dmp]
    User Mini Dump File: Only registers, stack and portions of memory are available
    Comment: '
    *** procdump  soffice.bin -h
    *** Hung window detected: 110946'
    Symbol search path is: c:\lodev\symbols;SRV*c:\Symbols\mssymbols\*http://msdl.microsoft.com/download/symbols 
    Executable search path is: 
    Windows 7 Version 7601 (Service Pack 1) MP (2 procs) Free x86 compatible
    Product: WinNt, suite: SingleUserTS
    Machine Name:
    Debug session time: Fri Jun  1 07:58:39.000 2012 (UTC + 2:00)
    System Uptime: not available
    Process Uptime: 0 days 0:00:44.000
    ................................................................
    ................................................................
    ............................................................
    Loading unloaded module list
    ..............
    eax=00000000 ebx=00e7b174 ecx=00000000 edx=00000000 esi=00000002 edi=00000000
    eip=77d0013d esp=00e7b124 ebp=00e7b1c0 iopl=0         nv up ei pl zr na pe nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
    ntdll!ZwWaitForMultipleObjects+0x15:
    77d0013d 83c404          add     esp,4
    0:000>
    

    Введите !analyze -v в окне команды.

    0:000> !analyze -v
    

    WinDbg начнет анализ исключений. Дождитесь окончания.

    0:000> !analyze -v
    *******************************************************************************
    *                                                                             *
    *                        Exception Analysis                                   *
    *                                                                             *
    *******************************************************************************
    FAULTING_IP: 
    +612e2faf0463dc04
    00000000 ??              ???
    EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
    ExceptionAddress: 00000000
       ExceptionCode: 80000003 (Break instruction exception)
      ExceptionFlags: 00000000
    NumberParameters: 0
    FAULTING_THREAD:  00000f90 
    DEFAULT_BUCKET_ID:  STATUS_BREAKPOINT
    PROCESS_NAME:  soffice.bin
    
    [...]
    
    Followup: MachineOwner
    ---------
    

    Скопируйте весь вывод в новый текстовый документ и прикрепите к отчёту.

    Создание дополнительного отладочного вывода

    In certain situations LO developer can ask you to apply a patch to particular source file and gather additional debug information by using OutputDebugString function available in Windows as following:

    Download free DebugView utility.

    Ensure your LibreOffice debug build and DebugView are run.

    Reproduce a crash.

    DebugView will gather debug information:

    00000001	0.00000000	[5112] WinInetBackend A 759F0000	
    00000002	0.00007052	[5112] WinInetBackend B 759F6F21	
    00000003	0.01316426	[5112] WinInetBackend C 0 14 0	
    00000004	0.01324074	[5112] WinInetBackend D 0 14 0 6F0C82FD 00000028
    

    Copy output to new text document and attach to the bug report.

    Additional Information

    Daily (development) builds of the master branch

    You can find the most current development build from Win-x86@39 tinderbox that you can obtain here:
    https://dev-builds.libreoffice.org/daily/master/Win-x86@39/current

    Testing on a non-Windows OS

    If you'd like to run a Windows backtrace from within a non-Windows operating system, you can setup a virtual environment using these Microsoft provided VHD images. These VHD images can be run within Oracle Virtualbox and VMware Workstation. Alternatively, you can run the Windows installation within any virtualization software, including VMware Player, and QEMU/KVM.

    See also