Debug: Programm läuft! Release: Programm macht fehler!
-
hmm also es ist wirklich mehr als komisch:
ich hab die Privilegienfunktion nun verändert:BOOL SetProcRegAccessPrivs(char* szPriv,bool bSet) { HANDLE hCurrentToken=NULL; LUID lPriv={NULL}; TOKEN_PRIVILEGES tpPriv={NULL}; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hCurrentToken)) { //MessageBox(0,"Error getting Process Token","ERROR",MB_ICONERROR|MB_ICONINFORMATION); return false; } if(!LookupPrivilegeValue(NULL,szPriv, &lPriv)) { //MessageBox(0,"Error getting Privilege Values","ERROR",MB_ICONERROR|MB_ICONINFORMATION); return false; } tpPriv.PrivilegeCount = 1; tpPriv.Privileges[0].Luid = lPriv; if(bSet) tpPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tpPriv.Privileges[0].Attributes = 0; if(!AdjustTokenPrivileges(hCurrentToken, FALSE, &tpPriv, 0, (PTOKEN_PRIVILEGES) NULL, 0)) { //MessageBox(0,"Error setting Privilege Values","ERROR",MB_ICONERROR|MB_ICONINFORMATION); return false; } return true; }so und an der gleichen Pos im Quelltext hab ich die nötigen privilegien "händisch" übergeben:
if(!SetProcRegAccessPrivs(SE_BACKUP_NAME,true)||!SetProcRegAccessPrivs(SE_RESTORE_NAME,true))
{
cout<<endl;
cout<<"Fatal-Error: Privileg-Registration failed!"<<endl;return 0;
}und nun läufts plötzlich.
Nun wäre meine Frage: Sind Funktionen im Releasemodus plötzlich anders?? Oder nimmt meine einstige nur den ersten Parameter und im Debugmode funktionierts trotzdem!?
Ich blick da nicht ganz durch...Danke,
mfg
mitos
-
Ich würde mal sagen, das ist ein klassischer Fall von Bereichsüberschreitung - TOKEN_PRIVILEGES endet mit einem unbestimmten Array, und der Compiler hat vermutlich hinter diesem Array keinen Platz mehr gelassen, so daß der Zugriff auf tpPriv.Privileges[1] andere Variablen beschädigt hat.
-
hmm also kürtzt der compiler im releasemode alles total
ich hatte eigentlich immer nur probleme mit dem releasemode... Was sind den eigentlich die grundsätzlichen unterschiede zwischen den beiden modi (klar, größe, geschwindigkeit und debuginfos) aber sonst?danke,
mfg
mitos
-
Der Compiler optimiert stärker, lässt einige "unnütze" Daten und Anweisungen weg (z.B. setzt er im Debug-Modus Füll-Bytes um deine Daten, so daß Bereichsüberschreitungen nichts gefährliches bewirken) und Debug-Anweisungen wie ASSERT() oder TRACE() werden auch ersatzlos gestrichen.
(außerdem werden gelegentlich Funktionen ausgetauscht gegen schnellere, aber anfälligere Versionen)
-
naja dann ist es doch eigentlich besser oder sicherer die debug versionen zu nehmen und einfach bei den projekteigenschaften für die entgültige version die debuginfos weglassen...
denn eigentlich hab ich nicht wirklich nachteile bis auf die größe was aber egal ist 120KB oder 500KB naja... und ob das Programm 2ms früher fertig ist...
oder?
mfg
mitos
-
Ja, theoretisch kannst du meist mit der Debug-Version wunderbar arbeiten, allerdings ist die nicht nur größer, sondern auch langsamer. (und die Debug-Bibliotheken dürfen oft nicht unabhängig vom Compiler weitergegeben werden)
-
(und die Debug-Bibliotheken dürfen oft nicht unabhängig vom Compiler weitergegeben werden)
Wie läuft das genau?
solange ich keine urrheberrechtlich geschützten dll's z.b. von microsoft mit meinem Programm zusammen weiterschicke, ist das ja egal oder?
Solange ich nur die *.exe-Datei habe, die einfach die Standard-windows-dll's nutzt, darf ich das programm doch weitergeben oder?
Und wenn nicht, wieso darf ichs im release schon und im debug-mode nicht mehr weitergeben bzw. wo ist dann der unterschied?danke für deine geduld

mfg
mitos
-
hi, weil die debug vesion bibliotheken braucht, die du nicht weitergebben daffst.
-
ja ok, aber welche? und ich geb auch keine *.dll dateien weiter, sondern wenn würd ich nur meine .exe weitergeben... Oder kann man in vc++ irgendwo in den projekteintstellungen die einstellung setzen dass er die bibliotheken gleich weglässt? was sind das eigentlich für biblios?

danke
mfg
mitos
-
Statisch gelinkte. Die sind in deiner EXE drin und somit würdest du sie mitgeben. Sind prinzipiell Bibliotheken, die den Debug-Prozess unterstützen, also Dinge wie ASSERT und ähnliches. AFAIK!
gruß
Martin