Eric Vernié

Les nouvelles API de Windows 7 et Windows Server 2008 R2 :
API Windows Error Reporting

Auteur : Eric Vernié relation technique développeurs

Dans mon 1er article, qui traitait des API Application Recovery & Restart, j'indiquais qu'elles allaient de pair avec l'infrastructure de Windows Error Reporting, mais sans rentrer dans le détail. Dans ce second article consacré à Windows Error Reporting nous irons une peu plus loin, en examinant les nouveautés qu'apportent Windows 7 et Windows 2008 R2 Serveur.

Sommaire de l'article

  1. Introduction
  2. Windows Error Reporting
  3. Utilisation des API Windows Error Reporting
  4. Conclusion

 

>>Téléchargez le module au format Word

>> Téléchargez les codes sources

 

Introduction

A la sortie de Windows Vista on vous a beaucoup parlé de l'expérience utilisateur, au travers de sa nouvelle interface graphique, au travers de la sécurité, ainsi qu'au travers de la version 3.0 du Framework .NET. Pléthore d'articles sur la possibilité de développer de nouvelles applications qui prennent en charge la 3D avec les API Windows Presentation Fundation (WPF), qui communique à l'aide de Windows Communication Fundation (WCF), ainsi que Windows Workflow Fundation (WF).

Mais ce n'est que la partie émergée de l'iceberg. En effet Windows Vista et Windows Serveur 2008 vont bien au delà, et apportent de grandes nouveautés, tant au niveau noyau, qu'au niveau API Win32 et COM et qui ne sont pas exposées directement par le Framework .NET.

Ces nouveautés, mettent en évidence 3 piliers fondamentaux de Windows Vista et de Windows Serveur 2008 :

  • La robustesse
  • Laperformance
  • Lasécurité

Dans mon 1er article, qui traitait des API Application Recovery & Restart, j'indiquais qu'elles allaient de pair avec l'infrastructure de Windows Error Reporting, mais sans rentrer dans le détail. Dans ce second article consacré à Windows Error Reporting nous irons une peu plus loin, en examinant les nouveautés qu'apportent Windows 7 et Windows 2008 R2 Serveur.

Technologies utilisées:

C/C++

C++/CLI (C++ qui cible la plate-forme .NET)

Visual Studio 2010

(disponible en téléchargement ici)

Software development Kit Windows 7

Haut de pageHaut de page  

 

Windows Error Reporting

WER est une fonctionnalité de Windows qui permet à l'utilisateur de notifier Microsoft via le site http://winqual.microsoft.com des erreurs de l'application, des erreurs du noyau etc. Microsoft, est en mesure alors d'utiliser cette fonctionnalité pour fournir des solutions à l'utilisateur. Les développeurs peuvent utiliser cette infrastructure et recevoir des informations afin d'améliorer leurs applications.

 

Figure 1, illustre Windows Error Reporting lorsque l'application TestRM.EXE plante.

 

 

Figure 1 : Interface typique de Windows Error Reporting dans Windows 7

 

Si l'utilisateur clique sur le lien "Rechercher une solution en ligne et redémarrer le programme", WER se connecte au portail Microsoft http://winqual.microsoft.com, pour essayer de trouver une solution au problème.

Si vous êtes éditeurs de logiciels, vous avez la possibilité d'ajouter votre application en adhérant (gratuitement) au site Winqual. Pour de plus amples informations rendez-vous à cette adresse https://www.microsoft.com/whdc/maintain/StartWER.mspx.

Remarque :

Par défaut le mode de signalement des erreurs de Windows 7, est configuré pour rechercher automatiquement une solution. Pour obtenir le mode de signalement comme sur la figure 1, allez dans le panneau de configuration, tapez choisir comme sur la figure suivante :

 

 

Sélectionnez choisir le mode de signalement des problèmes, puis cocher la case chaque fois qu’un problème se produit, me demander avant de rechercher les solutions comme sur la figure ci-dessous:

 

 

Haut de pageHaut de page  

 

Utilisation des API Windows Error Reporting

Tout d'abord il faut inclure le fichier werapi.h et se lier à la librairie wer.lib, toutes les fonctions, structures, constantes, sont reconnaissables, car elles commencent par le préfix Wer.

Par défaut, toutes les applications qui tournent sous Windows 7, y-compris la vôtre sont assujetties à WER.

Bien qu'il soit possible de configurer WER via des clés de registre, la fonction WerAddExcludedApplication vous permet d’exclure votre application par programmation.

Exemple :

HRESULT hr=::WerAddExcludedApplication (L"TestRM.EXE",false);

      if (FAILED(hr))

      {

            //Code omis pour plus de clarté

      }

En excluant de WER votre application, les problèmes ne sont plus mis dans une file d'attente, et la boite de dialogue classique Figure 2, apparait ne vous demandant plus de vérifier la solution sur internet.

 

 

Figure 2

 

Pour revenir en arrière, utilisez la fonction WerRemoveExcludedApplication()

Il est également possible de modifier les messages de l'interface de WER comme à la Figure 2

 

 

Figure 2 : Personnalisation de la fenêtre de WER.

 

1.    Pour ce faire, il faut créer un handle de rapport avec la fonction WerReportCreate().

2.    Ensuite on utilise le handle précédemment crée, avec la fonction WerReportSetUIOption()
pour personnaliser la fenêtre de WER.

3.    On soumet le rapport avec la fonction WerReportSubmit()
Cette API permet d’envoyer un rapport d’erreur avec un dump lorsque l’application plante.

4.    Puis on ferme le handle de rapport avec la fonction WerReportCloseHandle()

Remarque :

Pour plus de détails, vous retrouverez dans les fichiers attachés à cet article, tout le code source qui illustre la personnalisation de la fenêtre de WER, ainsi que la soumission d'un rapport d’erreur.

Il est possible également de configurer les données qui seront collectées et ajoutées au rapport d’erreur

WerSetFlags permet de configurer les données qu’y seront envoyées.
WerRegisterMemoryBlock et WerreportAddDump, permettent de combiner des données mémoires au dump et de les ajouter au rapport d’erreur.

Enfin, l’API WerReportAddFile, permet d’ajouter un fichier (autre qu’un dump) au rapport d’erreur.

Par exemple, avec Windows 7, un nouvelle utilitaire est disponible (PSR.EXE, Problem Step Recorders) qui permet d’enregistrer les étapes d’utilisation de votre application, de sauvegarder ces étapes dans un fichier, que vous pourrez alors ajouter au rapport d’erreur.

Pour activer PSR, suivez les étapes suivantes :

1)    Lancez l’application TestRM.exe
2)    Activez le menu Démarrez, puis tapez PSR
3)    L’application d’enregistrement ce lance

4)    Commencer l’enregistrement

5)    Entrez des données dans l’application, puis appuyez sur le bouton “Crash”

6)    Arrêter l’enregistrement, il vous sera alors demandé de sauvegarder un fichier compréssé, contenant un fichier avec extension mht lisible dans Internet explorer, et qui comprend, des captures d’écrans de toutes les étapes d’utilisation de l’application.

Il est alors possible d’ajouter au rapport d’erreur de Windows Error Reporting, ce fichier, enrichissant ainsi les informations qui permettra au développeur de l’application d’avoir un cas de figure reproductible

Haut de pageHaut de page  

 

Application de test

Avec cet article, vous retrouverez, un exemple qui met en œuvre ces API.
Mais attention, il ne fonctionne que sous Windows Vista/ 7ou Windows Serveur 2008, et 2008 R2 car ces API ne sont pas disponibles avec les versions antérieures de Windows.

1)    Démarrez l'application TestRM.EXE

2)    Cochez la case "Exclure de Windows Error Reporting"

3)    Appuyez sur le bouton "Appliquer"

4)    Appuyez sur le bouton "Crash"

5)    La boite de dialogue suivante doit apparaître

 

Modification de la fenêtre de Windows Error Reporting.

1)    Exécutez le programme TestRM.EXE

2)    Appuyez sur le bouton "Crash 2 !!"
La fenêtre suivante doit apparaître
3)    Windows Error reporting, à mis en file d'attente l'erreur qui c'est produite.
Dans mon exemple, j'ai ajouté au rapport, mes propres informations, comme le type d'erreur, ainsi que la pile des appels. En appuyant sur le bouton "Voir les détails sur ce problème", vous y aurez accès.
4)    Il est également possible de vérifier que Windows Error Reporting a mis en file d'attente le problème.
Pour ce faire, ouvrez le panneau de configuration.
Dans la boite de rechercher tapez le texte : Afficher tout (comme dans la figure suivante)
5)    Puis sélectionnez : Afficher tous les rapports d’erreurs
6)    En double cliquant sur l'erreur, on obtient également le détail.
Haut de pageHaut de page  

 

Quelques mots sur le code fournis :

Pour illustrer mon exemple, j'ai utilisé le langage de développement C++/CLI (qui cible la plate-forme .NET) pour son incroyable efficacité en termes d'interopérabilité entre le monde Natif et le Monde .NET. En effet c'est le seul langage qui permet de mixer dans le même source, à la fois du code .NET (C++/CLI) et du code natif, facilitant ainsi l'utilisation de ces API Win32.

L'interface a été développée à l'aide des Windows Form de la plateforme .NET qui appel une bibliothèque nommée HelperAPI, qui elle-même encapsule l'appel aux API de Windows Error Reporting ainsi que celle de l'API Application Recovery & Restart.

Cette bibliothèque est en charge entre autre de convertir les types .NET en type natif.

L'intérêt d'avoir mixer les deux mondes, est de démontrer que l'on peut très bien continuer à développer en C++ natif et améliorer son système, tout en l'intégrant facilement dans une nouvelle plate-forme comme .NET.

Haut de pageHaut de page  

 

Conclusion

Comme nous le venons de le voir, l'infrastructure Windows Error Reporting apporte une formidable opportunité aux développeurs d'ajouter à leurs applications plus de robustesse et de fournir ainsi à l'utilisateur une meilleur expérience en cas de crash. Si vous souhaitez en savoir plus sur l'aide que peux apporter Windows Error Reporting, rendez-vous à l'adresse https://www.microsoft.com/whdc/maintain/WERHelp.mspx

Dans les prochains articles, nous continuerons notre saga sur la robustesse d'application avec Windows Vista / 7, Windows Serveur 2008 et 2008 R2, en illustrant les API suivantes :

  • Kernel Transaction Manager (KTM) et NTFS Transactionnel (TxF)
    De la transaction ACID sur des fichiers
  • Wait Chain Traversal
    Comment détecter les étreintes fatales (deadlock) dans son application ?
  • Performances logs & Alert
    Comment collecter des informations utiles pour la résolution de problèmes ?
Haut de pageHaut de page