Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 06.06.2004, 12:27 Titel: Debug Version läuft, Release stürtzt immer ab |
|
|
Ich wollte eigentlich mal unser neues Projekt vorstellen, aber die Release Versions stürtzt immer ab. Die Debugversion läuft hingegen fehlerfrei. Weiß jemand woran das liegen kann?
Ich hab versucht die Releaseversion zu Debugfeen, bekommen den Fehler "Acces Violation", aber anders als in der Debugversion wird nicht der Quellcode sondern:
Code: |
0040405A nop
0040405B nop
0040405C nop
0040405D nop
0040405E nop
0040405F nop
00404060 mov cl,byte ptr ds:[4717E0h]
00404066 mov al,1
00404068 test al,cl
0040406D enter 0D88h,0E0h
00404071 pop ss
00404072 inc edi
00404073 add cl,ch
00404075 pop es
00404076 add byte ptr [eax],al
|
angezeigt. (Ist nur ein kleiner Auszug, der Fehler tritt in der Reihe mit dem "test" auf).
Gibt es jettz irgendeine Möglichkeit, den Fehler zu beheben? Was kann den in der Debugversion anders sein? Beide lassen sich ohne Fehler und Warnungen kompilieren. Der einzige unterscheid: Dbug läuft perfekt, Release stürtzt sofort nach dem Start ab. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 06.06.2004, 13:22 Titel: |
|
|
In der Releaseverson alle Variablen initialisieren (Debug sind alle globalen auf 0 gesetzt)
Ansonsten ist die Debug Runtime auch "genädiger" wenn du Speicher überschreibst. Kannst mal Memory Check aktivieren, dann bekommst du die Fehler auch. Mit der DX Debug Runtime testest du ja bestimmt sowieso, oder?
C. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 06.06.2004, 14:35 Titel: |
|
|
Ich hab jetzt mal mittels Errorlogfunktion die Funktion in der er Abstürtzt gefunden:
Code: |
void CBlocks::LoadBlocks(int NumBlocks)
{
m_BlockInfo=new BlockTyp[NumBlocks];
char cBlockname[8];
//Alle Blockinformationen aus der ini-Datei laden
for(int i=0; i<NumBlocks; i++)
{
Error("test");
sprintf(cBlockname, "Block%d", i);
m_BlockInfo[i].Hitpoints=ReadINIfloat(cBlockname, "Hitpoints");
m_BlockInfo[i].Size.x=ReadINIfloat(cBlockname, "SizeX");
m_BlockInfo[i].Size.y=ReadINIfloat(cBlockname, "SizeY");
m_BlockInfo[i].Size.z=ReadINIfloat(cBlockname, "SizeZ");
m_BlockInfo[i].Typ=i;
}
} |
Was komisch ist: Wenn ich den Erroraufruf weglassen (auskommentire oder lösche) stürtzt er ab. Wenn ich ihn aber wie oben schreiben funktioniert es. Die Debugversion funktioniert immer, das problem ist nur bei der Release.
Die Errorfunktion macht nichts weiter als den übergebenen String in ne Datei zu schreiben. Ich hb auch schon die Projektdateien gelöscht und neu erstellt, weil ich dacht Vc hätte wieder mal einen Fehler.
Es ist mir absolut unerklärlich, warum ich den Erroraufruf nicht weglassen kann. Den Die Releaseversion soll ja nicht andauernd ne Errodatei erstellen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 06.06.2004, 15:45 Titel: |
|
|
Sowas ist typisch, wenn du Speichergrenzen überschreibst. NumBlocks kann definitiv nicht größer als 2 Stellen werden, usw.?
C. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 06.06.2004, 16:25 Titel: |
|
|
Im Moment ist es immer NumBlocks immer auf 2. Aber wieso sollte es funktionieren wenn ich die ErrorFunktion jdesmal Aufrufe? Die kann doch den Rest der Schleife nicht beeinflussen. Ich hab den AUfruf auch mal an andere Stellen in die Schleife geschrieben, es funktioniert, solange ich sie irgendwo in der Schleife aufrufe. Aus Sicherheitsgründen hab ich auch mal den Speicher für cBlockname auf 16 erhöht. Bringt aber alles nix.
Kann es sein das das ein Bug in VC++ ist?
Achja: Wie stell ich den MemoryCheck ein? Vieleicht find ich den Fehler ja damit. Und das mit der DX Debug Runtime, weiß ich nicht so genau. Wo stellt man das den ein? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 06.06.2004, 16:31 Titel: |
|
|
Visual C++ hat bestimmt keinen Bug
Die DX-Debug Runtime stellst du unter Systemsteuerung -> DirectX -> Direct3D Reiter, dann Debug ein. Memorycheck so:
Code: |
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
// ...
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
// der Aufruf der folgenden Funktion bewirkt, dass Informationen über
// Memory-Leaks und Deffekte beim Beenden des Programms ausgegeben werden
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
// ....
}
|
C. |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 06.06.2004, 16:40 Titel: |
|
|
Das sollte in die FAQ. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 06.06.2004, 21:12 Titel: |
|
|
Ich finde bei mir unter Systemsteurung kein DirectX Eintrag (WinXP)
Hab erst alle Katewgorien durchsucht und dann auf "zur klassischen Ansicht wechseln" geklickt, da ist kein DirectX Einteag. Hab ichs vieleicht flasch installiert?
MemoryCheck hab ich wie beschrieben aktiviert, aber ich merke keinen Unterschied. Kommt keine Fehlermeldung oder so.
Da seltsame ist, das wenns im Fullscreen läuft es sofort kommentarlos beendet. Wenn Ichs im Fenstermodus staarte, kommt noch die Fehlermeldung und ich kann auf Debug klicken. Aber seltsamemrweise zeigt er mir immer ne andere Adresse (Zeile) an. Und aus diesen Millionen Einträgen kann man ja auch nicht so recht schlau werden.
Aber wie kann es nur sein, das der ErrorAufruf entscheident ist, obs funktioniert oder nicht?Das passt mir nicht in die Logig. Das kann doch überhaupt nicht sein! _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 06.06.2004, 21:16 Titel: |
|
|
Hast du bei der DX Installation die Debug-Runtime mitinstalliert? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 06.06.2004, 21:21 Titel: |
|
|
Ich glaub schon. Aber ich installiers am besten noch mal neu.
Nur: Wenn ich jetzt weiß, das es genau in der Schleife abstürtzt, und in der Schleife nix von DirectX ist, kann mir das dann überhaupt bei diesem problem weiterhelfen?Ich meine, das ist doch eher ein allgemeines Problem und hat nix mit DirectX zu tun. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 06.06.2004, 21:24 Titel: |
|
|
Ja, ich denke immer noch, dass es ein Speicherproblem ist, in der Ausgabe steht tatsächlich nichts (im Debugmodus)?
C. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 06.06.2004, 22:23 Titel: |
|
|
Also ich hab auf Ausführen (F5) geklickt und damit die Debugversion gestartet. Lief wunderbar, hab sie beendet. Unten in dem Fenster (neben Erstellen) tand bei Debug:
Code: |
ntdll.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\kernel32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\d3d9.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\d3d8thk.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\gdi32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\user32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\advapi32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\rpcrt4.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\msvcrt.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\version.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\winmm.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\dinput8.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
Geladene Symbole für "C:\WINDOWS\system32\Syncor11.dll"
"C:\WINDOWS\system32\uxtheme.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\hid.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\setupapi.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\ntmarta.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\wldap32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\ole32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\samlib.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
Thread 0x6E4 wurde mit Code 0 (0x0) beendet.
Thread 0x4C8 wurde mit Code 0 (0x0) beendet.
Das Programm "D:\C++\4Pong\Debug\4Pong.exe" wurde mit Code 0 (0x0) beendet.
|
Ich hab mal Testweise den Erroraufruf durch die den Aufruf von TestFile() ersetzt. Die Funktion prüft ob eine Datei existiert, indem sie versucht sie zu öffnen. Damit hats auch funktioniert. Wenn ich aber statt TestFile ne andere globale Funktion aufrufe, gehts wieder nicht! Diese andere Funktion hieß Zahl() und macht aus nem charArray eine int-V. Die ersten beiden Funktionen öffneten jeweils ne Datei, aber daran kanns doch nicht liegen, oder? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 06.06.2004, 22:25 Titel: |
|
|
Kannst du das Problem isolieren? Du kannst mir den Code auch mal schicken, ich kann es mir mal angucken.
C. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 06.06.2004, 22:35 Titel: |
|
|
Angesichts dieser langen Diskussion glaub ich kaum das wir das Problem hier im Forum so schnell lösen können. Wäre echt net, wenn du dir das mal anschauen würdest. Aber ich warne dich: Wenn du deinen Namen drunter schreibts und den Source weiterfverkaufst, kauf ich nie wieder ein Buch von dir!
Du müsstest mir nur deine E-Mail verraten, aus dem Forum heraus kann ich ja keine Daten anhängen. (Schreibt ne PN falls du die nicht allen verraten willst) _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
C++Builder Senior JLI'ler
Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 07.06.2004, 19:55 Titel: |
|
|
versuchsmal mit CodeOptimierungen aus stellen bei SDL programmen wirkt das Wunder! |
|
Nach oben |
|
|
|