IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Plantage au démarrage d'une application


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut Plantage au démarrage d'une application
    Bonjour,
    J'ai développé une application en C#, qui appelle des dll en C++ Win32.
    Sur mon poste de développement, tout se passe bien.
    Par contre, losque je change de PC (tout en XP SP2), j'ai une méchante fenêtre Windows classique, qui me demande d'envoyer un rapport à M$...

    Avez vous des idées sur l incompatibilité ?

    Merci

    P.S : J ai bien inclue mes 2 dll au projet

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Salut,

    pourrais-tu poster le rapport technique d'erreur ?

    Karl.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Je vous l'envoie dès demain matin.
    Si ca peut vous aider, l'appli fonction sur mon PC Perso, sur lequel j'ai aussi VS 2005.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pas de .doc sur internet, s'il te plait. Tout le monde n'est pas aussi imprudent que moi...
    Ça, ça ne nous apporte rien. S'il y a une erreur dans la partie .Net, on devrait avoir une exception, exception qui serait plus intéressante que ces fenêtres.

    Tu devrais regarder dans les journaux d'événements (Applications ou Système) voir s'il n'y a pas plus d'infos sur le plantage dedans (notamment l'exception)...
    PS: C'est une application console ou fenêtrée ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par karl3i
    pourrais-tu poster le rapport technique d'erreur ?
    C'est pour ça que j'ai joint ce doc

    C'est une application console ou fenêtrée ?
    Fenêtrée
    Tu devrais regarder dans les journaux d'événements
    Applications :
    .NET Runtime 2.0 Error Reporting
    Système :
    source | Evénement
    ---------------------------
    SideBySide | 59
    SideBySide | 59
    SideBySide | 32

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    OK, c'est mort : Windows est trop avare d'informations.

    Mon conseil pour déboguer à la brutasse: Tu entoures tout ton code d'un gros try-catch et dans le catch, tu enregistres dans un fichier toutes les informations possibles sur l'exception (type, message, stacktrace et la même chose pour toutes les InnerException)...

    Bien sûr, il est possible que l'exécution n'arrive même pas jusqu'au main(), surtout si tu as des variables globales ou statiques avec constructeur, et que ça plante dedans...

    En théorie, tu devrais aussi pouvoir régler ton programme en programme console en changeant juste ses paramètres, lancer le programme depuis un invite de commande et voir si quelque chose s'y affiche quand ça plante...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Bien ...
    Voilà où j'en suis :

    - Ca plante avant le main

    - Dans la classe du "main" (C#), j'ai une référence public dont la classe est définie dans une dll. Si je vire cette déclaration, tout va bien.

    La dll est en C++ natif avec un wrapper.
    En attendant votre eventuel aide, je fais vider ma dll pour voir si ca change qqch.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Question : est-ce qu'il peut être intéressant de comparer les dll windows de mes 2 PC ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Ma dll C++ utilise les MFC en dynamique. Est ce qu'il me manque des dll ?

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je l'ignore.
    Essaie d'instancier dans le main() une référence du même type que la référence en question, pour voir quel genre de message ou d'exception tu obtiens...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Je ne sais plus trop quoi faire ...

    Voilà ce qu'affiche le débuggeur lors du démarrage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\MyApp\IHM\bin\Debug\WindowsApplication1.vshost.exe' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System.Deployment\2.0.0.0__b03f5f7f11d50a3a\System.Deployment.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\MyApp\IHM\bin\Debug\WindowsApplication1.vshost.exe' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System.Deployment\2.0.0.0__b03f5f7f11d50a3a\System.Deployment.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    Le thread 0x784 s'est arrêté avec le code 0 (0x0).
    Le programme '[3828] WindowsApplication1.vshost.exe: Managé' s'est arrêté avec le code 0 (0x0).
    Le thread 0x450 s'est arrêté avec le code 0 (0x0).
    Le thread 0xeb4 s'est arrêté avec le code 0 (0x0).
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\MyApp\IHM\bin\Debug\WindowsApplication1.exe' chargé, symboles chargés.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\MyApp\IHM\bin\Debug\MyDll.dll' chargé, symboles chargés.
    'WindowsApplication1.vshost.exe' (Managé)*: 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcm80d.dll' chargé, symboles chargés.
    Si vous avez des idées...

    Je pense que c'est le chargement de la dll qui se passe tres mal

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ben...
    Il n'indique aucun plantage, ce debugger...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Tout a fait d accord.
    Ici, c'est lancé sur le PC de développement.

    C'est pour ça, l'objectif était d'identifier l'ensemble des dll appelés lors du démarrage.

    Je pense à une dll absente sur le PC cible. Mais laquelle ....?

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Bonsoir,

    Voilà où en sont mes investigations :
    J'ai installé sur la cible ce package, mais ça n'a pas fontionné.

    J'ai installé sur la cible VS 2005 (uniquement C#), ça a fonctionné.
    j'ai déinstallé VS 2005, ça ne fonctionne plus.

    Que faut-il sur ma cible ? quelles fichiers sont utilisés par l'appli ?

    Merci pour vos réponses ; je commence à déséspérer

    Nicolas
    Strasbourg

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2004
    Messages : 52
    Points : 60
    Points
    60
    Par défaut
    Salut,
    La DLL non managée que tu utilises, tu l'as mise dans quel répertoire?

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Il s'agit d'une dll Managée (j'utilise un Wrapper).
    Elle se trouve dans le même dossier que mon application.

    A cet emplacement, celà fonctionne si VS 2005 est installé.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2004
    Messages : 52
    Points : 60
    Points
    60
    Par défaut
    Peux tu mettre le code que tu utilises pour appeler ta dll?

  18. #18
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    petite question toute conne...

    Avec VS d'installé, ca marche .. et sans, ca plante...

    Pour moi, ca ressemble bien à un soucis lié potentiellement aux DLL de debug..

    Ton application, tu n'essayerais pas de la faire tourner en debug sur une
    machine sans VS ?

    Parce qu'il faut savoir que en Debug, des dll (mfc... du type xxx_d.dll) sont
    installées et utilisées et bien sur, ces DLL n'ont rien à faire sur un système
    qui ne fait pas de developpement (d'ailleurs, il est "interdit" de livrer des
    dll en debug... normalement

    Pour moi, ca pourrait expliquer ton problème.. donc, piste à suivre : vérifier
    que tout est bien en RELEASE et non en debug... Quelque part; )

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par theMonz31
    La regle est : Livraison d'un logiciel = TOUT EN RELEASE....

    (car les dll de debug ne sont pas installé sur un système... et il est INTERDIT
    de livrer des dll de debug... de façon officielle

    The Monz, Toulouse

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Phenolphtaleine
    Peux tu mettre le code que tu utilises pour appeler ta dll?
    Ma classe de dll est wrappée, donc ... c'est tout con :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public static class Program
        {
    
            static public MaClasse MonObjet ;
        .........}

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Détecter le démarrage d'une application
    Par subzero01 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/10/2008, 11h24
  2. Attente de démarrage d'une application
    Par T-B dans le forum Langage
    Réponses: 1
    Dernier message: 22/01/2008, 15h34
  3. image en démarrage d'une application
    Par mehdiing dans le forum 2D
    Réponses: 3
    Dernier message: 21/03/2007, 15h19
  4. fenêtre de démarrage d(une application
    Par lesipce dans le forum JBuilder
    Réponses: 1
    Dernier message: 28/08/2006, 16h34
  5. Réponses: 4
    Dernier message: 11/10/2005, 21h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo