2009-09-11 7 views
1

Il existe un constructeur sur StackTrace qui prend une exception en tant qu'argument. Tout bien et bien, mais je remarque que tous les autres constructeurs disent qu'il obtiendra le StackTrace du thread en cours, mais le constructeur en prenant l'exception ne dit rien à ce sujet autre queStackTrace à partir de Exception sur différents threads?

La trace de pile résultante décrit la pile au moment de l'exception .

Je veux juste être sûr que je vais obtenir le StackTrace correct d'une exception, même si je crée le StackTrace sur un thread différent que l'exception a été créée lorsque je crée le StackTrace d'une exception dans un autre thread.

Quelqu'un peut-il confirmer s'il vous plaît?

Répondre

1

Semble assez facile à essayer, à moins que je ne manque quelque chose. Cela imprime la bonne trace de pile pour moi.

static Exception threadEx; 

static void Main() 
{ 
    Thread worker = new Thread(DoWork); 
    worker.Start(); 
    worker.Join(); 

    if (threadEx != null) { 
     StackTrace trace = new StackTrace(threadEx); 
     Console.WriteLine(trace); 
    } 
} 

static void DoWork() 
{ 
    try { 
     throw new Exception("Boom!"); 
    } 
    catch (Exception ex) { 
     threadEx = ex; 
    } 
} 
+0

Merci Mattias, j'ai finalement testé pour moi-même aussi, et vous avez raison, il n'imprime le droit trace de la pile. –

1

Il va créer le StackTrace pour le thread sur lequel il est appelé (en interne, il appelle 'CaptureStackTrace' avec pour le paramètre 'targetThread', qui indique que le thread actuel est demandé). Le seul ctor qui crée pour un autre thread est celui qui prend une instance Thread.

+0

Cela contredit Mattias et mes tests. Je l'ai juste regardé dans Reflector et null est passé comme targetThread à 'CaptureStackTrace'. Il appelle ensuite 'GetStackFramesInternal' en passant l'exception. Cependant, je ne peux pas voir la source de 'GetStackFramesInternal'. –

+0

Oui, c'est étrange. Dans Win32, NULL signifie "thread en cours", mais ici, il semble signifier autre chose. GetStackFramesInternal est mis en œuvre dans le MSCorEE.dll ... Je regardais dans la source de SSCLI, et a trouvé la mise en œuvre dans le fichier \ clr \ src \ vm \ debugdebugger.cpp: if (pException == NULL) { // Thread est NULL si c'est le thread actuel. data.TargetThread = pStackFrameHelper-> TargetThread; GetStackFrames (NULL, (void *) - 1, &data); } autre { GetStackFramesFromException (& pException, &data); } – codekaizen