web-dev-qa-db-fra.com

Exception SEH avec le code 0xc0000005 levé dans le corps du test

J'écris un test en utilisant GoogleTest pour la classe suivante et j'obtiens l'erreur ci-dessus.

class Base
{
    // Other Functions;

    CSig objSig[50];
}

La classe CSig est la suivante:

class CSig
{
    //... constructor, destructor(empty) and some functions
    CMod *objMod;
    CDemod *objDemod;
}

CSig :: CSig
{
    bIsInitialised = false;

    for (int i=0; i<MAX_NUM; i++)
    {
        PStrokePrev[i] = 0.0;
    }
}

Cependant, lorsque je supprime CSig objSig[50], les tests fonctionnent correctement.

Que puis-je faire pour résoudre ce problème? De plus, je dois avoir CSig objSig[50] dans la classe de base.

21
chintan s

Une exception SEH (Structured Exception Handling) n'est pas une exception C++ pouvant être gérée à l'aide de constructions de langage c ++ (try-catch), mais elle est générée à partir de Windows et pointe vers une faille fondamentale. Les exceptions SEH sont très gênantes car elles ne provoquent pas de déroulement normal de la pile, ce qui peut entraîner des fichiers non fermés ou des mutex non déverrouillés qui devraient normalement être effacés par les destructeurs de l'objet propriétaire n’appartenant pas au processus actuel, je vous recommande donc de consulter les instructions relatives à la mémoire dans le constructeur et le destructeur de CSig . Vous pouvez en savoir plus sur SEH, par exemple, ici

24
MadScientist

La façon dont je viens de trouver le problème est que dans Visual Studio, je suis allé dans Debug-> Exceptions et tout vérifié dans la première colonne. Ensuite, lancez/déboguez vos tests unitaires, et une exception apparaîtra sur la ligne où se trouve le problème. C'est là que vous devez déboguer/résoudre le problème.

10
Michele

J'ai rencontré ce problème en utilisant GoogleTest avec Visual Studio 2010. Notre configuration implique la création d'une bibliothèque pour Google Frame Frameworks, qui est ensuite liée à nos tests unitaires individuels. J'ai récemment mis à jour le support Frameworks et l'ai recompilé à partir de zéro. Après cela, j'ai rencontré l'exception décrite ci-dessus.

Après avoir creusé un peu, j'ai découvert que le paramètre 'Struct Member Alignment' était le coupable: 

Propriétés du projet> Propriétés de configuration> C/C++> Génération de code> Alignement des membres de la structure

Alors que le projet Frameworks avait le paramètre défini sur 'default', le projet de test unitaire correspondant l'avait configuré avec "1 Byte/Zp1". Une fois que je les ai changés pour avoir le même alignement, le problème a disparu.

5
MutantXenu

Pour moi, cela semblait être une erreur de référence nulle. Certaines méthodes ont été appelées sur un nullptr et pour des raisons qui ne me semblent pas claires, elles n’ont pas échoué immédiatement mais ont juste commencé à s’exécuter. L'erreur SEH s'est probablement produite dès l'accès à la mémoire non allouée. Alors vérifiez les pointeurs nuls!

3
Chiel ten Brinke

J'ai un problème similaire et il concerne les variables non initialisées et je lance le test dans la version release. J'ai eu un caractère * non initialisé après quoi initialisé à NULL semble avoir résolu le problème.

1
TrustyCoder

Si vous utilisez Visual Studio 2013, cochez la case Lancé pour les exceptions Win32 (en particulier la violation d'accès) dans Debug> Exceptions. Cela vous permettra de déboguer quelle ligne a le problème. Cela peut être utile car le débogueur ne se cassera pas si votre programme lève normalement d’autres exceptions.

0
Chaitanya