none
fonction Trace et Debug RRS feed

  • Question

  • bonjour,

    j'ai créer une application avec 2010 et aujourd'hui suite a des bug je souhaiterais tracer les actions des utilisateurs étant donné que ces derniers ne savent jamais comment reproduire les bugs.

    j'ai regarder les fonction Debug et Trace et je dois bien avouer que je saisi difficilement leur utilisation.

    je pensais que la création d'un listener permettait de relever les différentes actions effectuées. Malheureusement dans tous les exemples que j'ai regarder et essayer de comprendre a chaque fois il est nécessaire de rajouter writeline ou write pour aller écrire dans le fichier Log.

    D'ou mon interrogation a quoi sert la classe trace si il faut aller mettre les lignes que l'on souhaite ecrire dans le code de l'application.

    Si quelqu'un pouvait m'expliquer le fonctionnement de la classe Trace cela serait sympa.

    Cordialement



    Xavier


    • Modifié fanchy jeudi 20 décembre 2012 11:01
    jeudi 20 décembre 2012 11:01

Réponses

  • Bonjour,

    L'idée est juste de séparer ce que l'on écrit vers la trace et la destination réelle des ces informations. On doit effectivement faire un Trace.WriteLine (comment l'application pourrait savoir ce que l'on veut tracer ?)

    A cette trace sont également associées des "écouteurs" ce qui permet au final de diriger cette information vers n'importe quelle destination, un fichier texte ou xml, le journal des évènements de Windows etc...

    Voir peut-être du côté de http://msdn.microsoft.com/fr-fr/library/x5952w0c.aspx

    Cet outil : http://windows.microsoft.com/fr-fr/windows7/How-do-I-use-Problem-Steps-Recorder permet éventuellement à un utilisateur de capturer rapidement les étapes suivies pour produire un bug.

    Il serait peut-être effectivement intéressant de voir le principe de ce produit et de l'intégrer éventuellement dans une appli ce qui permettrait de tracer par exemple les appuis sur les boutons etc... (j'imagine que c'est basé sur les "Hooks" Windows).

    Dans un premier temps commencer peut-être par mettre des traces çà et là...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse Aurel Bera mardi 8 janvier 2013 08:04
    jeudi 20 décembre 2012 12:55
    Modérateur
  • Bonjour,

    J'ai vu du code ou il est possible d'écouté tous les messages d'une WinForm, il est certainement possible de faire une sortie vers un fichier texte (et faire un filtre sur les messages)

    edit le code :

    Imports System
    Imports System.Runtime.InteropServices
    Imports System.Drawing
    Imports System.ComponentModel
    Imports System.Windows.Forms
    
    
    Public Class MainClass
    
        Shared Sub Main(ByVal args As String())
            Dim myform As Form = New Form1()
            Application.Run(myform)
        End Sub
    
    End Class
    
    Public Class Form1
        Public Structure Rect
            Public left As Integer
            Public top As Integer
            Public right As Integer
            Public bottom As Integer
        End Structure
    
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            Const WM_SIZING As Long = &H214
            Const WMSZ_LEFT As Integer = 1
            Const WMSZ_RIGHT As Integer = 2
            Const WMSZ_TOP As Integer = 3
            Const WMSZ_TOPLEFT As Integer = 4
            Const WMSZ_TOPRIGHT As Integer = 5
            Const WMSZ_BOTTOM As Integer = 6
            Const WMSZ_BOTTOMLEFT As Integer = 7
            Const WMSZ_BOTTOMRIGHT As Integer = 8
            Static fixed_aspect_ratio As Double = 0
            Dim new_aspect_ratio As Double
            If m.Msg = WM_SIZING And m.HWnd.Equals(Me.Handle) Then
                Dim r As Rect = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(Rect)), Rect)
                Dim width As Double = r.right - r.left
                Dim height As Double = r.bottom - r.top
    
                new_aspect_ratio = height / width
    
                If fixed_aspect_ratio = 0 Then
                    fixed_aspect_ratio = new_aspect_ratio
                End If
    
                If fixed_aspect_ratio <> new_aspect_ratio Then
                    If m.WParam.ToInt32 = WMSZ_TOPLEFT Or m.WParam.ToInt32 = WMSZ_TOPRIGHT Or m.WParam.ToInt32 = WMSZ_BOTTOMLEFT Or m.WParam.ToInt32 = WMSZ_BOTTOMRIGHT Then
                        If new_aspect_ratio > fixed_aspect_ratio Then
                            width = height / fixed_aspect_ratio
                        Else
                            height = width * fixed_aspect_ratio
                        End If
                    ElseIf m.WParam.ToInt32 = WMSZ_LEFT Or m.WParam.ToInt32 = WMSZ_RIGHT Then
                        height = width * fixed_aspect_ratio
                    ElseIf m.WParam.ToInt32 = WMSZ_TOP Or m.WParam.ToInt32 = WMSZ_BOTTOM Then
                        width = height / fixed_aspect_ratio
                    End If
    
                    If m.WParam.ToInt32 = WMSZ_TOP Or m.WParam.ToInt32 = WMSZ_TOPLEFT Or m.WParam.ToInt32 = WMSZ_TOPRIGHT _
                    Then
                        r.top = r.bottom - CInt(height)
                    Else
                        r.bottom = r.top + CInt(height)
                    End If
                    If m.WParam.ToInt32 = WMSZ_LEFT Or m.WParam.ToInt32 = WMSZ_TOPLEFT Or m.WParam.ToInt32 = WMSZ_BOTTOMLEFT Then
                        r.left = r.right - CInt(width)
                    Else
                        r.right = r.left + CInt(width)
                    End If
                    Marshal.StructureToPtr(r, m.LParam, True)
                End If
            End If
            Console.WriteLine(m)
            MyBase.WndProc(m)
        End Sub
    End Class


    Cordialement,


    • Modifié TroxsaEditor jeudi 20 décembre 2012 19:29 j'ai trouvé le code :-)
    • Marqué comme réponse Aurel Bera mardi 8 janvier 2013 08:05
    jeudi 20 décembre 2012 19:18
    Auteur de réponse
  • Bonsoir,

    La classe Debug ne va fonctionner que lorsque votre application est en développement (compilation Debug dans VS). Avec ce mode toutes vos instructions Debug.WriteLine("exemple") seront redirigées vers la console interne de VS (output). La classe Trace comme l'a dit Patrice permet de rediriger sont flux comme on le souhaite (xml, html, txt...). Contrairement à la classe Debug, Trace fonctionne en compilation Release mais aussi Debug. Voir les liens proposés par Patrice.

    Vous pouvez aussi utiliser l'événement AppDomain.CurrentDomain.UnhandledException qui sera appelé lors d'une erreur non gérée. Cet événement doit être implémenté au chargement de l'application. Grâce à lui à chaque problème il passera par cet événement. ça facilitera la Trace pour éviter d'écrire beaucoup de code.

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !



    • Modifié Lyamine jeudi 20 décembre 2012 22:16
    • Marqué comme réponse Aurel Bera mardi 8 janvier 2013 08:05
    jeudi 20 décembre 2012 21:33
  • Bonjour

    Une solution c’est d’utiliser Entreprise Library:

    http://msdn.microsoft.com/en-us/library/ff647732.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

    Je la préfère parce ’que on a la possibilité de rapporter les exceptions dans n’importe quel format, sans recompiler l’application, aussi que on a la possibilité d’avoir plusieurs fichiers de log par jour/semaine et de effacer les fichiers plus vieux (ca viens après une expérience après un fichier de log de 40 GO). 

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    • Proposé comme réponse TroxsaEditor vendredi 28 décembre 2012 10:26
    • Marqué comme réponse Aurel Bera mardi 8 janvier 2013 08:05
    vendredi 21 décembre 2012 12:56
  • Bonjour,

    Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?

    Désormais, nous marquons les solutions proposées. N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte. Merci !

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    • Marqué comme réponse fanchy lundi 4 février 2013 07:28
    mardi 8 janvier 2013 08:05

Toutes les réponses

  • Bonjour,

    L'idée est juste de séparer ce que l'on écrit vers la trace et la destination réelle des ces informations. On doit effectivement faire un Trace.WriteLine (comment l'application pourrait savoir ce que l'on veut tracer ?)

    A cette trace sont également associées des "écouteurs" ce qui permet au final de diriger cette information vers n'importe quelle destination, un fichier texte ou xml, le journal des évènements de Windows etc...

    Voir peut-être du côté de http://msdn.microsoft.com/fr-fr/library/x5952w0c.aspx

    Cet outil : http://windows.microsoft.com/fr-fr/windows7/How-do-I-use-Problem-Steps-Recorder permet éventuellement à un utilisateur de capturer rapidement les étapes suivies pour produire un bug.

    Il serait peut-être effectivement intéressant de voir le principe de ce produit et de l'intégrer éventuellement dans une appli ce qui permettrait de tracer par exemple les appuis sur les boutons etc... (j'imagine que c'est basé sur les "Hooks" Windows).

    Dans un premier temps commencer peut-être par mettre des traces çà et là...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse Aurel Bera mardi 8 janvier 2013 08:04
    jeudi 20 décembre 2012 12:55
    Modérateur
  • Bonjour,

    J'ai vu du code ou il est possible d'écouté tous les messages d'une WinForm, il est certainement possible de faire une sortie vers un fichier texte (et faire un filtre sur les messages)

    edit le code :

    Imports System
    Imports System.Runtime.InteropServices
    Imports System.Drawing
    Imports System.ComponentModel
    Imports System.Windows.Forms
    
    
    Public Class MainClass
    
        Shared Sub Main(ByVal args As String())
            Dim myform As Form = New Form1()
            Application.Run(myform)
        End Sub
    
    End Class
    
    Public Class Form1
        Public Structure Rect
            Public left As Integer
            Public top As Integer
            Public right As Integer
            Public bottom As Integer
        End Structure
    
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            Const WM_SIZING As Long = &H214
            Const WMSZ_LEFT As Integer = 1
            Const WMSZ_RIGHT As Integer = 2
            Const WMSZ_TOP As Integer = 3
            Const WMSZ_TOPLEFT As Integer = 4
            Const WMSZ_TOPRIGHT As Integer = 5
            Const WMSZ_BOTTOM As Integer = 6
            Const WMSZ_BOTTOMLEFT As Integer = 7
            Const WMSZ_BOTTOMRIGHT As Integer = 8
            Static fixed_aspect_ratio As Double = 0
            Dim new_aspect_ratio As Double
            If m.Msg = WM_SIZING And m.HWnd.Equals(Me.Handle) Then
                Dim r As Rect = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(Rect)), Rect)
                Dim width As Double = r.right - r.left
                Dim height As Double = r.bottom - r.top
    
                new_aspect_ratio = height / width
    
                If fixed_aspect_ratio = 0 Then
                    fixed_aspect_ratio = new_aspect_ratio
                End If
    
                If fixed_aspect_ratio <> new_aspect_ratio Then
                    If m.WParam.ToInt32 = WMSZ_TOPLEFT Or m.WParam.ToInt32 = WMSZ_TOPRIGHT Or m.WParam.ToInt32 = WMSZ_BOTTOMLEFT Or m.WParam.ToInt32 = WMSZ_BOTTOMRIGHT Then
                        If new_aspect_ratio > fixed_aspect_ratio Then
                            width = height / fixed_aspect_ratio
                        Else
                            height = width * fixed_aspect_ratio
                        End If
                    ElseIf m.WParam.ToInt32 = WMSZ_LEFT Or m.WParam.ToInt32 = WMSZ_RIGHT Then
                        height = width * fixed_aspect_ratio
                    ElseIf m.WParam.ToInt32 = WMSZ_TOP Or m.WParam.ToInt32 = WMSZ_BOTTOM Then
                        width = height / fixed_aspect_ratio
                    End If
    
                    If m.WParam.ToInt32 = WMSZ_TOP Or m.WParam.ToInt32 = WMSZ_TOPLEFT Or m.WParam.ToInt32 = WMSZ_TOPRIGHT _
                    Then
                        r.top = r.bottom - CInt(height)
                    Else
                        r.bottom = r.top + CInt(height)
                    End If
                    If m.WParam.ToInt32 = WMSZ_LEFT Or m.WParam.ToInt32 = WMSZ_TOPLEFT Or m.WParam.ToInt32 = WMSZ_BOTTOMLEFT Then
                        r.left = r.right - CInt(width)
                    Else
                        r.right = r.left + CInt(width)
                    End If
                    Marshal.StructureToPtr(r, m.LParam, True)
                End If
            End If
            Console.WriteLine(m)
            MyBase.WndProc(m)
        End Sub
    End Class


    Cordialement,


    • Modifié TroxsaEditor jeudi 20 décembre 2012 19:29 j'ai trouvé le code :-)
    • Marqué comme réponse Aurel Bera mardi 8 janvier 2013 08:05
    jeudi 20 décembre 2012 19:18
    Auteur de réponse
  • Bonsoir,

    La classe Debug ne va fonctionner que lorsque votre application est en développement (compilation Debug dans VS). Avec ce mode toutes vos instructions Debug.WriteLine("exemple") seront redirigées vers la console interne de VS (output). La classe Trace comme l'a dit Patrice permet de rediriger sont flux comme on le souhaite (xml, html, txt...). Contrairement à la classe Debug, Trace fonctionne en compilation Release mais aussi Debug. Voir les liens proposés par Patrice.

    Vous pouvez aussi utiliser l'événement AppDomain.CurrentDomain.UnhandledException qui sera appelé lors d'une erreur non gérée. Cet événement doit être implémenté au chargement de l'application. Grâce à lui à chaque problème il passera par cet événement. ça facilitera la Trace pour éviter d'écrire beaucoup de code.

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !



    • Modifié Lyamine jeudi 20 décembre 2012 22:16
    • Marqué comme réponse Aurel Bera mardi 8 janvier 2013 08:05
    jeudi 20 décembre 2012 21:33
  • Bonjour

    Une solution c’est d’utiliser Entreprise Library:

    http://msdn.microsoft.com/en-us/library/ff647732.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

    Je la préfère parce ’que on a la possibilité de rapporter les exceptions dans n’importe quel format, sans recompiler l’application, aussi que on a la possibilité d’avoir plusieurs fichiers de log par jour/semaine et de effacer les fichiers plus vieux (ca viens après une expérience après un fichier de log de 40 GO). 

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    • Proposé comme réponse TroxsaEditor vendredi 28 décembre 2012 10:26
    • Marqué comme réponse Aurel Bera mardi 8 janvier 2013 08:05
    vendredi 21 décembre 2012 12:56
  • Bonjour,

    Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?

    Désormais, nous marquons les solutions proposées. N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte. Merci !

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    • Marqué comme réponse fanchy lundi 4 février 2013 07:28
    mardi 8 janvier 2013 08:05
  • Bonjour,

    Merci pour toutes vos réponses.

    Désolé de ne pas avoir répondu plus tôt, mon silence étant du a des problèmes personnels.

    J'ai bien pris connaissances de l'ensemble des scénarios proposes et j'ai pu comprendre plus facilement le mode de fonctionnement du trace et du debug.

    Merci pour vos réponses 

    Cordialement


    Xavier

    lundi 4 février 2013 07:31