How to get a backtrace with WinDbg/fr

From The Document Foundation Wiki
Jump to: navigation, search

Introduction

LibreOffice, comme tout logiciel peut s'arrêter ou crasher pendant son exécution. Lorsque cela se produit, des données de débuggage peuvent être collectées pour être transmises aux développeurs LibreOffice afin qu'ils puissent corriger le bug. Ces données sont appelées "stack trace" et peuvent être communiquées via le bugtracker. Cette procédure fonctionne pour toutes les versions de LibreOffice à partir de la version 4.2.0. Cet article vous guidera pour obtenir une "stack trace" depuis le débugger WinDbg.

Première exécution

Installer WinDbg
  1. Installer WinDbg à partir de Outil de débuggage pour Windows
    • Utilisateurs de Windows 7 et 8
      Télécharger le Windows SDK pour Windows 8.1 [direct link] à l'installation, ne cocher que la case 'Debugging Tools for Windows'. (Il faut déjà disposer du Framework ".NET Framework 4.5 redistributable" [1], normalement déjà pré-installé avec Windows 8.1.)
    • Utilisateurs Windows XP et Vista
      Télécharger le Windows SDK pour .NET 4.0 ou .NET 3.5 SP1 à l'installation, ne cocher que la case 'Debugging Tools for Windows'. Il faut déjà disposer du Framework ".NET Framework 4.5 redistributable" .NET 4.0 ou .NET 3.5 SP1.
    • Notes concernant l'installation
      L'installation nécessite de disposer d'un accès administrateur. Si ce n'est pas le cas, faire un clic droit sur le .msi et choisir "exécuter en tant qu'administrateur". En cas d'erreur lors de l'installation, la cause la plus probable est la présence de "Visual C++ 2010 Redistributable". Il peut être nécessaire de le désinstaller.
      WinDbg dans le menu de démarrage
  2. Lier la "Symbol Sources" avec le débugger
    • Avec WinDbg
      Démarrer WinDbg depuis le menu de démarrage de windows. Il se trouve dans Debugging Tools for Windows folder.
      Note: Si le répertoire n'est pas présent, relancez l'installationdu débugger, cliquez sur l'option 'Change', et sélectionnez 'Debugging Tools for Windows' puis continuez l'installation.
      Lorsque WinDbg a démarré, cliquez sur File ▸ Symbol File Path... et collez le texte suivant dans la zone de saisie.
      CACHE*C:\symbols;SRV*http://dev-downloads.libreoffice.org/symstore/symbols;SRV*http://msdl.microsoft.com/download/symbols
      
      Si vous voulez aussi pouvoir faire une trace sur les versions 'master' (Win-x86@39 tinderbox), collez plutôt le texte suivant
      CACHE*C:\symbols;SRV*http://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
      
      Ajouter les symboles
      Cliquez ensuite sur File ▸ Save workspace pour sauvegarder ces données dans le débugger.
    • Avec Visual Studio
      Les traces peuvent être obtenues avec Visual Studio Express 2005 ou plus en ouvrant Tools ▸ Options ▸ Debugging ▸ Symbols et en ajoutant les URLs précédemment citées dans le 'Symbol Server'.
      http://dev-builds.libreoffice.org/daily/master/Win-x86@39/symbols
      http://dev-downloads.libreoffice.org/symstore/symbols

Débugger

Pour commencer à débugger, démarrer WinDbg et LibreOffice. Des copies d'écrans sont disponibles à la fin de cette section pour vous aider.

Dans WinDbg, appuyez sur F6 ou cliquez sur File ▸ Attach to a Process.... Dans la boîte de dialogue, choisissez soffice.bin dans la liste (il se trouve à la fin de la liste si LibreOffice est le dernier programme que vous avez lancé). Après avoir appuyé sur OK, les lignes suivantes vont s'afficher dans une fenêtre, les derniers caractères seront 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

Vous verrez également une zone de commande avec un curseur clignottant. Pour lancer le débuggage, vous pouvez soit appuyer sur F5, cliquer sur Debug ▸ Go ou taper g, puis entrée. Lorsque le débuggage aura démarré, la ligne de commande deviendra grise et affichera Debuggee is running.... Le mot *BUSY* sera affiché à gauche.

Retourner maintenant dans LibreOffice sans fermer WinDbg pour reproduire le plantage. Quand vous avez reproduit le plantage, retournez dans WinDbg. Une série e lignes sera affichée dans la fenêtre, la dernière devrait avoir un ? à la fin.

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=???????

Notez que la ligne de commande est redevenue blanche. Cliquez dedans et tapez !analyze -v, puis entrée. WinDbg va démarrer l'analyse et affichera *BUSY*. Attendez patiemment que l'analyse se termine.

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
---------

Quand l'analyse sera terminée, le mot *BUSY* aura disparu. Sélectionnez alors l'intégralité du texte, puis copiez-le à l'aide de Ctrl+C, ou en cliquant sur Edit ▸ Copy ou via un clic droit/copier.

Lancez un éditeur de texte démarrer ▸ Tous les programmes ▸ Accessoires ▸ Bloc Notes, puis collez le texte à l'aide de Ctrl+V, en cliquant sur Edit ▸ Paste, ou right-click ▸ Paste. Sauvez le fichier avec Ctrl+S ou File ▸ Save et nommez le fichier backtrace.txt.

LibreOffice est verrouillé par WinDbg. Il faudra quitter WinDbg en appuyant sur Alt+F4 ou en cliquant sur File ▸ Exit. Si une boîte de dialogue affiche "Save information for workspace?", choisissez No. Cela fermera WinDbg et LibreOffice.

Copies d'écran WinDbg

Step 1 - Menu File
Step 2 - Sélectionner soffice.bin
Step 3 - Prêt à recevoir une commande
Step 4 - Debugage en cours
Step 5 - Debugage complet
Step 6 - Analyse complète
Step 7 - Copier l'analyse

Producing a mini dump

Sometimes WinDbg cannot catch the LO exception properly. In such case we have to produce a mini dump which then can be loaded and parsed in the debugger. To produce such dump you can use free ProcDump utility as following:

Ensure your LibreOffice debug build is running.

In the Windows command prompt type:

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

Reproduce a crash.

When LibreOffice window hung is detected ProcDump will inform about successful mini dump creation.

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>

Open WinDbg and load .dmp file (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>

Type !analyze -v in the command window.

0:000> !analyze -v

WinDbg will start exception analysis. Wait patiently for the output:

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
---------

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

Producing additional debug output

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.

Automation

You can prepare a one-click debugging environment, so that WinDbg starts already attached to a designated LO process (for example to production regularly installed LO or to LO master in parallel installation), with the debuggee running. First save workspace with symbols file path in WinDbg ("Workspace-master" used here). Then make a batch file in Windows, using that workspace name. Adjust path to soffice.exe and timeout required for LO to start, just enough for WinDbg to attach to it.

cd "C:\Program Files (x86)\LibreOffice 4\program"
start soffice.exe
timeout 5
C: # if PATH_TO is not on C: drive
cd "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86\"
start windbg.exe -W Workspace-master -pn soffice.bin -g

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:
http://dev-builds.libreoffice.org/daily/master/Win-x86@39/current
(It will install into a LibreOfficeDev folder separate from any existing LibreOffice released version installation. It does not override the installation of a released version. Open test files from inside LibreOfficeDev.)

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