c + + - Hvad skal du gøre, når dit program styrter før du går i hoved?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et meget mærkeligt problem. Vores firma ansøgning er en desktop app skrevet i C + + og kompilere med Visual Studio 2017. I de sidste flere uger i nogle tilfælde vil appen crash før du indtaster hoved. Jeg ved det, fordi jeg sætter pause i første linje i hoved og det bliver aldrig kaldt. Crash'et sker ikke hurtigt, så jeg har tid til at trykke pause i diagnoseværktøjet. Men jeg fik kun en besked. 'Din app er indtastet i en pause tilstand, men der er ingen kode, der skal vises, fordi hele tråden udførte ekstern kode ( typisk system eller rammekode). 'Sommetider rengøring everythings og genopbygge gør koden virker, men nogle gange ikke.


Jeg ved ikke engang, hvordan man begynder at undersøge dette, koden er flere år gammel og har aldrig haft dette problem.


Enhver ide om hvad du skal gøre?


Rediger


Som foreslået sætter jeg breakpoint i WinMainCRTStartup, og jeg sporer problemet til linje 224 funktion \_\_scrt\_common\_main\_seh () i exe\_common.inl:


hvis (\_initterm\_e (\_\_ xi\_a, \_\_xi\_z)!=0)
 returnere 255;


den linje fejler, så funktionen vender tilbage 255 og min hoved bliver aldrig kaldt. Enhver yderligere ide?

Bedste reference


Forudsat at debugger har problemer med at fange det, har jeg en ide, som kun kan virke.
Hvad med at indstille din egen terminate funktion via set\_terminate? http://www.cplusplus.com/reference/exception/set\_terminate/
Du kan gøre det i konstruktør af statisk global variabel, som måske bliver kaldt før det, der styrter din software. Uheldigvis er rækkefølgen af ​​initialisering af statiske variabler udefineret.
Forsøg at sætte breakpoint inde i det. [4]


int main()
{
    throw 0;
    return 0;
}

 struct reterminator
{
    static void myterminate() {
        std::cerr << "terminate handler called
";
        abort();  // forces abnormal termination
    }

    reterminator()
    {
        std::set\_terminate(myterminate);
    }
} static reterminator\_;

Andre referencer 1


Jeg får endelig mit program til at arbejde igen. Årsagen er, at programmet nu er udarbejdet ved hjælp af Visual Studio 2017, men nogle af biblioteket, der linker statisk til mit program, er bygget ved hjælp af tidligere visuelle studio, efter at jeg har genkompateret dem ved hjælp af Visual Studio 2017, kører mit program fint.


Så hvis du programmer er et crash, før du afslutter en af ​​de ting, du skal kontrollere, er at sikre, at hele dit bibliotek er bygget ved hjælp af den samme compiler og ved hjælp af de samme kompilatorswitches.