c ++ - windows applikation sammenbrud med rent virtuelt funktionsopkald

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en Windows-applikation, det styrter nu og da og ikke reroducibly.
Når det gør, får jeg ren virtuel funktion kaldet. Jeg har sat det op for at oprette en Windows-dump ved hjælp af ADplus, og selv når det går ned, er der aldrig et dump.


Jeg er temmelig sikker på, at dette er bygget fejl, jeg bygger ved hjælp af VC2008 SP1 og dette er udgivelsen build.


Enhver indsigt i dette? Hvordan kan jeg fejle dette, det er en udgivelse med .pdb-fil og kortfil.


Tak
Reza

Bedste reference


Som det allerede blev påpeget, er det meget usandsynligt, at dette er en byggefejl. Jeg havde et ret komplekst projekt med et lignende problem og kunne spore det ved at bruge \_set\_purecall\_handler og levere min egen handler. På denne måde var jeg i stand til at bryde ind i debuggeren, da det skete og se opkaldsstakken. Det er naturligvis et alternativ her at skabe minidumpen, når det sker. Husk at du skal forberede alt til minidumpen før programmet oplever en undtagelse.


Der er dog også en god chance for, at dette kan skyldes en korrupt korruption. I et sådant tilfælde ville jeg dog forvente en række symptomer. Du beskriver dette specifikke symptom, så det er sandsynligt, at din kode faktisk er i fejl.


Det ovennævnte projekt var et arvsprojekt, der modellerede noget, der ligner COM, og der var faktisk steder, hvor kompilatoren ikke kunne have fundet alle lejligheder af rene virtuelle funktioner, som ingen implementering eksisterede i afledte klasser.

Andre referencer 1


Først og fremmest skal du sørge for, at du ikke ringer til ren virtuel funktion. Hvis dette ikke er tilfældet, prøv at starte dit program under WinDbg. [3]

Andre referencer 2



  Jeg er temmelig sikker på, at dette er en fejl i bygningen



Meget, meget un sandsynligt. Det er meget mere sandsynligt, at dette er en fejl i din kode.


Du kan eventuelt skære en genstand et sted. Hvis du har din app oprettet for at generere en dumpfil på uhåndterede undtagelser, og du stadig dør uden dumpfil, så er det meget muligt, at fejlen er i undtagelseshandleren.


Du skal have en dumpfil. Det burde være din første prioritet.

Andre referencer 3


Hvis dit problem ikke er konstant, er der sandsynligvis nogle problemer med at skrive ud af indeks, som kan ødelægge hukommelsen

Andre referencer 4


Hvis du har prøvet en fuld ombygning, så forekommer det mere sandsynligt, at det er et kodende problem.


Ringer du til nogen (rene) virtuelle funktioner i nogen konstruktører eller destruktorer?


Det er mere sandsynligt, at du ringer en ren virtuel funktion på et slettet objekt, og vtable'en er flyttet til at pege på forældelsesobjektet. I dette tilfælde vil valgrind (gratis, linux) eller rens ($$$, Windows) virkelig være i stand til at hjælpe dig ud. VS kan også have en hukommelseskontroller med det også.

Andre referencer 5


Jeg havde engang et lignende problem med C ++. Jeg havde et kald til en virtuel funktion fra en konstruktør et sted, så objektet blev ikke konstrueret endnu, da opkaldet skete, og forklarede den 'rene' virtuelle funktion, der blev kaldt. Det kan også være et problem med skæring , hvis du har dårlige udgivelser på objekter i stedet for peger på objekter. Brug en debugger og trin for trin/backtrace for at finde kilden, så vi kan hjælpe dig bedre.

Andre referencer 6


Jeg har den samme fejl. Jeg gennemgik kode mange gange og fandt aldrig virtuelle funktioner i konstruktører eller destruktorer.
Problemet var i bygningssystem. Jeg havde en gammel statisk biblioteksversion på min computer, hvor en funktion ikke var ren virtuel og ny, da den blev (jeg tilføjede et mere abstraktionslag). Da EXE-filen blev oprettet med gammelt statisk bibliotek, men nye overskrifter, viste denne fejl .
Så sørg for at dine biblioteker og inklusiv filversioner er konsekvente, hvis intet andet hjælper.