[gelöst] Laufzeitfehler (Assertation) mit VS.Net 2003

Alles rund um die Programmierung mit Qt
Antworten
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

[gelöst] Laufzeitfehler (Assertation) mit VS.Net 2003

Beitrag von uhu01 »

Hy!

Ich habe einen kleinen Fehler bei der Benutzung eines QStrings, wobei der Fehler nicht von dem QString herrühren zu scheint. Sobald ich jedoch auf einen längeren QString (mind. 16 Zeichen) die Methode toStdString anwenden möchte bekomme ich im Debug Mode eine Exception die nicht abgefangen wollte, und zwar einen "User Breakpoint". Es ist jedoch eine Assertation die fehlgeschlagen hat, und zwar "_CrtIsValidHeapPointer(pUserData)".
Gehe ich dort auf Ignore, läuft das Programm problemlos weiter. Lt. dem was ich bei google gefunden habe, kommt das Problem vom mischen von Debug und Release Librarys.

Ich verwende VS.Net 2003 Pro mit folgendem Makefile:

Code: Alles auswählen

# NMake Makefile for nmake_test.exe

EXEC_NAME=febm
BIN_NAME=$(EXEC_NAME).exe

GCC=cl.exe
LNK=link.exe
MOC=C:\prog\qt401\bin\moc.exe

INC_DIR_OPTION=/I 
LIB_DIR_OPTION=/LIBPATH:

INC_DIR= $(INC_DIR_OPTION) "C:\prog\vs2003\VC7\include" \
         $(INC_DIR_OPTION) "C:\prog\qt401\include" \
         $(INC_DIR_OPTION) "C:\prog\Librarys\Include\WinPcap" \
         $(INC_DIR_OPTION) "C:\prog\qt401\include\QtCore" \
         $(INC_DIR_OPTION) "C:\prog\qt401\include\QtGui"
LIB_DIR= $(LIB_DIR_OPTION)"C:\prog\qt401\lib" \
		 $(LIB_DIR_OPTION)"C:\prog\vs2003\Vc7\PlatformSDK\Lib" \
		 $(LIB_DIR_OPTION)"C:\prog\vs2003\VC7\lib" \
		 $(LIB_DIR_OPTION)"C:\prog\Librarys\Lib"
LIBS= QtGuid4.lib QtCored4.lib wsock32.lib wpcap.lib

GCC_OPTIONS= /c /nologo /W3 /Wp64 /Zi /D "WIN32" /D "_DEBUG" /Gm /EHs /MTd /TP
LNK_OPTIONS= /nologo /SUBSYSTEM:CONSOLE /MACHINE:X86 /DEBUG
PDB_FILE = /Fd"Debug/vc70.pdb"

OBJS= Debug\main.obj Debug\CFebmChat.obj Debug\moc_CFebmChat.obj Debug\CSendThread.obj Debug\CPacket.obj

all: Debug\$(BIN_NAME)

###########################################################
#                     Executable                          #
###########################################################
Debug\$(BIN_NAME): $(OBJS)
	$(LNK) /OUT:"Debug\$(BIN_NAME)" $(LIB_DIR) $(LIBS) $(OBJS) $(LNK_OPTIONS) /PDB:"Debug\$(EXEC_NAME).pdb"
	
###########################################################
#                       main.obj                          #
###########################################################
Debug\main.obj: main.cpp Debug\CFebmChat.obj
	$(GCC) main.cpp $(INC_DIR) $(GCC_OPTIONS) /Fo"Debug/" $(PDB_FILE)
	
###########################################################
#                    CFebmChat class                      #
###########################################################

Debug\CFebmChat.obj: CFebmChat.cpp CFebmChat.h Debug\CSendThread.obj
	$(GCC) CFebmChat.cpp $(INC_DIR) $(GCC_OPTIONS) /Fo"Debug/" $(PDB_FILE)
	
Debug\moc_CFebmChat.obj: CFebmChat.h
	$(MOC) CFebmChat.h -o moc_CFebmChat.cpp
	$(GCC) moc_CFebmChat.cpp $(INC_DIR) $(GCC_OPTIONS) /Fo"Debug/" $(PDB_FILE)
	
###########################################################
#                    CSendThread class                    #
###########################################################

Debug\CSendThread.obj: CSendThread.cpp CSendThread.h CPacket.h
	$(GCC) CSendThread.cpp $(INC_DIR) $(GCC_OPTIONS) /Fo"Debug/" $(PDB_FILE)
	
###########################################################
#                  CEthPacket class                       #
###########################################################
	
Debug\CPacket.obj: CPacket.cpp CPacket.h
	$(GCC) CPacket.cpp $(INC_DIR) $(GCC_OPTIONS) /Fo"Debug/" $(PDB_FILE)
	
.PHONY: clean rebuild

clean:
	del /f /s /q .\Debug\*
	
rebuild: clean all
Der Aufruf von toStdString(...) befindet sich in CPacket.cpp, was allerdings irrelevant zu sein scheint, da der Fehler auch bei Aufrufen aus main.cpp und CFebmChat.cpp zu kommen scheint.

Ich muss leider das Makefile benutzen, darf kein qMake verwenden (Schule, etwas engstirniger Lehrer, bin nur froh das das VS Makefile gleich ist wie ein GNU)

Kann mir vielleicht irgendjemand sagen wo der Fehler in meinem Makefile liegt?

mfg
uhu01
Zuletzt geändert von uhu01 am 15. Dezember 2005 23:25, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Füge mal noch '-GR' und '-EHsc' (anstatt EHs) zu den Compilerflags hinzu - so wird die Qt-Dll auch gebaut.
Ist es Absicht dass '/MT' benutzt wird und nicht die shared-variante '/MD' - ich weiss nicht ob sich das verträgt...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

Hy!

Wie, die Qt Dll noch gebaut? Was meinst du damit, die wird doch nicht neu kompiliert werden?

Ich hab den MT deswegen statt des MD verwendet, da ich in meiner Anwendung Threads (QThread) benutze, dafür ist die doch, oder?

EDIT: thx, es funktioniert so!
PS: was /GR und was der Unterschied zwischen /EHs und /EHsc ist hab ich schon selbst rausgefunden, ich versteh allerdings nicht ganz warum das hinzufügen der Runtime-Type Information den Fehler behebt.

EDIT2: habs durchprobiert, liegt eindeutig am MTd!

EDIT3: nach einem kurzen nachsehen in der MSDN bin ich auf meinen Fehler draufgekommen. Thx nochmal

mfg
uhu01
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

uhu01 hat geschrieben:Hy!

Wie, die Qt Dll noch gebaut? Was meinst du damit, die wird doch nicht neu kompiliert werden?
Ich meine damit, dass deine vorkompilierte Dll höchstwahrscheinlich mit rtti gebaut wuorden ist und deshalb Du das auch nehmen solltest. Es ist eigentlich nur andersrum gefährlich - also Qt-dll ohne rtti, dein Programm aber mit - aber man weiss ja nie. Nachschauen mit welchen Optionen die Dll gebaut worden ist kann man in qt-4/.qmake.cache
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten