7
votes

Comment obtenir plus d'informations sur une exception

J'ai créé une solution dans Visual Studio 2008 sur Windows 7, 64 bits.

Ça fonctionne. p>

Lorsque je le déplace sur une autre machine, gagnez aussi 7, 64 bits, il s'est écrasé avec presque aucune information. P>

Le problème d'origine était ceci: p>

appel était rejeté par callee p>

J'ai ensuite implémenté cette solution: p>

Comment correctement gettypefromProgid pour Visual Studio 2008 P>

Cependant, mon problème est maintenant que lorsque j'exécute l'exécutable sur une autre machine, le programme est Crashing immédiatement avec les informations suivantes: p>

using System;
using System.Collections.Generic;
using System.Text;
using EnvDTE;
using EnvDTE80;
using EnvDTE90;
using System.Runtime.InteropServices;

namespace EmailSalesVolumeSolution
{
    public class MessageFilter : IOleMessageFilter
    {
        //
        // Class containing the IOleMessageFilter
        // thread error-handling functions.

        // Start the filter.
        public static void Register()
        {
            IOleMessageFilter newFilter = new MessageFilter();
            IOleMessageFilter oldFilter = null;
            CoRegisterMessageFilter(newFilter, out oldFilter);
        }

        // Done with the filter, close it.
        public static void Revoke()
        {
            IOleMessageFilter oldFilter = null;
            CoRegisterMessageFilter(null, out oldFilter);
        }

        //
        // IOleMessageFilter functions.
        // Handle incoming thread requests.
        int IOleMessageFilter.HandleInComingCall(int dwCallType,
          System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr
          lpInterfaceInfo)
        {
            //Return the flag SERVERCALL_ISHANDLED.
            return 0;
        }

        // Thread call was rejected, so try again.
        int IOleMessageFilter.RetryRejectedCall(System.IntPtr
          hTaskCallee, int dwTickCount, int dwRejectType)
        {
            if (dwRejectType == 2)
            // flag = SERVERCALL_RETRYLATER.
            {
                // Retry the thread call immediately if return >=0 & 
                // <100.
                return 99;
            }
            // Too busy; cancel call.
            return -1;
        }

        int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee,
          int dwTickCount, int dwPendingType)
        {
            //Return the flag PENDINGMSG_WAITDEFPROCESS.
            return 2;
        }

        // Implement the IOleMessageFilter interface.
        [DllImport("Ole32.dll")]
        private static extern int
          CoRegisterMessageFilter(IOleMessageFilter newFilter, out 
          IOleMessageFilter oldFilter);
    }
    [ComImport(), Guid("00000016-0000-0000-C000-000000000046"),
    InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    interface IOleMessageFilter
    {
        [PreserveSig]
        int HandleInComingCall(
            int dwCallType,
            IntPtr hTaskCaller,
            int dwTickCount,
            IntPtr lpInterfaceInfo);

        [PreserveSig]
        int RetryRejectedCall(
            IntPtr hTaskCallee,
            int dwTickCount,
            int dwRejectType);

        [PreserveSig]
        int MessagePending(
            IntPtr hTaskCallee,
            int dwTickCount,
            int dwPendingType);
    }
}


1 commentaires

Pouvez-vous pointer sur une ligne spécifique après avoir attaché un débogueur?


4 Réponses :


2
votes

Essayez d'impression davantage à partir de l'exception: xxx pré>

Vous pouvez également l'utiliser pour attraper toutes les extrémités internes également: P>

string except = "Uncaught Exception: ";
while(e != null)
{
    except += e.Message + ";\n";
    e = e.InnerException;
}


9 commentaires

Essayez de joindre un débogueur pour voir quelle ligne se bloque


Le programme fonctionne bien en mode de débogage et de libération sur ma machine, mais lorsque je le déplace vers une autre machine, l'exécutable crache la poubelle ci-dessus


Fwiw, e.tostring () donne le message complet d'exception et StackTrace


Mis à jour, laissez-moi savoir si vous réussissez à joindre le débogueur.


merci beaucoup ce que je fais en ce moment télécharge vs 2008 express


Après avoir téléchargé IW, je vais essayer de compiler avec elle sur l'autre ordinateur et de vous faire savoir


S'il vous plaît essayez ma dernière solution. Et pouvez-vous indiquer une ligne spécifique après avoir attaché un débogueur?


Comment puis-je ajouter VS 9 DTE comme une dépendance?


Je ne sais pas comment vous installez votre application, mais envisagez d'utiliser InstallSheild ou lisant ceci: http://stackoverflow.com/questions/11011088/how-to-include-d Ependaisons-in-configuration -et-déploiement-proj ect



2
votes

Vous pouvez également essayer de vous abonner au appdomain.currentdomaine.unhandleXception Evénement: xxx

fais cela en haut de Méthode principale .


4 commentaires

merci, je viens d'essayer cela et d'avoir toujours le même résultat


Si vous avez Visual Studio sur une autre machine, vous pouvez ajouter débogger.break la commande pour parcourir le code dans le débogueur. BTW Avez-vous des invocations de code non gérées dans votre application?


Je vous remercie. Je pense que j'ai un code non géré (je ne sais pas ce que c'est, mais je l'ai collé)


Essayez d'ajouter après votre essai ... Catch Block un de plus Catch sans paramètre Catch {MessageBox.Show ("Exception conforme non CLS capturée."); } . Au moins nous saurons que nous avons une exception non CLS



0
votes

La seule solution qui a fonctionné était d'installer Visual Studio. Dès qu'il a été installé, j'ai obtenu exactement l'exception.


4 commentaires

Tout comme un fyi, une Appcrash avec un module de défaut de kernelbase.dll signifie qu'une exception a été lancée pendant que vous êtes là où à l'intérieur de Kernelbase.dll. En C #, cela signifie généralement qu'un de vos appels interopest a quelque chose qui ne va pas avec elle. Personnellement, j'ai eu cela que cela me soit arrivé en raison d'une typographie dans une signature de méthode, à partir de la capture d'écran de l'erreur une fois que vous avez Visual Studio, il ressemble peut-être un GUID invalide pour votre objet COM (peut-être qu'il n'est pas enregistré)


@Merci tellement pour votre conseil! Cela serait-il vrai même si cela fonctionne sur ma machine et non sur une autre machine?


Votre DLL peut ne pas être inscrit sur la machine cliente. Vérifiez la DLL que vous appelez l'objet COM pour et faire un regsvr32 youcomdllname.dll en tant qu'administrateur. Selon si vous utilisez une application 32 bits ou 64 bits, vous devrez peut-être utiliser la copie de regsvr32 dans C: \ windows \ system32 ou dans c: \ windows \ sswow64 (sur une manière en arrière, la version 64 bits est dans System32 et la version 32 bits est en SYSWOW64)


@DANPE Quelle est la solution exacte s'il vous plaît donnez-moi.



1
votes

Votre DLL peut ne pas être enregistré sur la machine cliente. Vérifiez la DLL que vous appelez l'objet COM pour et faire un regsvr32 youcomdllname.dll dans une invite de commande administrative (clic droit sur l'icône d'invite de commande et do exécutez en tant qu'administrateur . Selon si vous utilisez une application 32 bits ou 64 bits, vous devrez peut-être utiliser la copie de regsvr32 dans c: \ windows \ system32 ou dans c: \ windows \ sswow64 < / code> (sur une manière en arrière, la version 64 bits est dans System32 et la version 32 bits est en SYSWOW64)


Si vous obsertez simplement la DLL de votre ordinateur ne fonctionne pas exécuter walker de dépendance sur le programme de votre ordinateur. Lorsque vous obtenez toutes les DLL que votre programme touche votre programme, vérifiez que l'ordinateur client ne manque aucun. La DLL que vous appelez peut être là, mais une DLL cela dépend de peut ne pas être.


4 commentaires

La dépendance Walker peut vous montrer quelle DLL est manquante, comparez simplement la liste qu'il vous donne sur votre machine à la liste que vous avez sur l'autre machine. Assurez-vous de faire Profile-> Démarrer le profilé Lorsque vous exécutez le walker de la dépendance car il ne choisira pas de la DLL limitée tardité comme votre COM DLL jusqu'à ce que vous l'exécutions dans le profileur.


Scott, je suis toujours en attente que l'utilisateur se déconnecte de la machine afin que je puisse jouer avec elle, mais si vous soupçonnez-vous que c'est le problème étant donné qu'il ne fonctionne pas sur deux ordinateurs qui n'ont pas encore la version complète de Visual Studio installées encore Cela fonctionne sur le mien qui a une version complète de VS installée?


Je trouve cela peu probable. Il est beaucoup plus probable qu'il existe une DLL tiers qui n'a rien à voir avec VS Votre code s'appuie sur celui-ci a été installé sur votre ordinateur mais n'est pas installé sur la machine du client. (Si la DLL Votre programme s'appuie sur Écrit (ou au moins une fois satisfait une fois) dans VS sur votre machine également, je le sais que les réagissions automatiques de la DLL pour tester si vous avez des paramètres définis. Cela pourrait être de la manière dont il s'est enregistré). Ou peut-être c'était une case à cocher sur un installateur .msi vous aviez vérifié que votre client n'a pas (exemple: le SQL SDK est livré avec SQL Server, mais est une installation optionnelle)


Merci encore Scott pour tellement d'aide à ce sujet. Il n'y avait pas d'installateur, je viens de copier l'ensemble du dossier de débogage sur une autre machine