Seite 1 von 1

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

Verfasst: 15. Dezember 2005 21:21
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

Verfasst: 15. Dezember 2005 22:41
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...

Verfasst: 15. Dezember 2005 23:03
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

Verfasst: 16. Dezember 2005 06:58
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