Autant pour moi, DEBUG_NEW n'est utilisé que par le debugger de Visual.
Autant pour moi, DEBUG_NEW n'est utilisé que par le debugger de Visual.
"L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]
non non c'est pas grave t'étais pas au courant, mais alors, comment faire pour savoir là ou j'ai mes fuites...
Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu
Un ptit up car je ne m'en ors pas, j'ai pourtant bien verifié, je pense bien avoir verifié toutes mes allocation sont bien libéré (enfin ça c'est que je crois mais la preuve que non). Alors si quelqu'un a une solution sous codeblocks et ming pour voir les alloc pas libere....
Merci!
Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu
Il y a bien le truc d'Emmanuel Delahaye, mais il ne marche bien que pour les malloc()...
Sinon, puisque tu sembles aimer jouer avec HeapAlloc(), peut-être as-tu la solution de créer plusieurs heaps : Ainsi, au moment de détruire les heaps, tu devrais savoir lequel a des fuites...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
euh.....pour tout te dire je suis pas amoureux des heap...c juste que l'exemple en utilisait alors...
Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu
Bonjour tous le monde !
Toujours dans me galères de mémoire (j'arrète d'utiliser le mot fuite ça fait beaucoup trop glousser mes collègues ).
J'ai récuperer le logiciel MemProof, quand je lance mon appli avec, elle crash alors que quand je lance mon appli seule il n'y a aucun souci...
MemProof m'indique :Bon, problème mémoire si je comprend bien. Pour m'aider un peu j'avais mis des cout un peu partout, pour debugger, mais quand je l'execute avec MemProof la fenetre se ferme directe et n'étant pas superman (pourtant j'ai essayé, si si mes fesses s'en souviennent) j'ai pas le temps de lire. Je me suis donc dis, je compile l'appli en mode GUI et je redirige mes cout vers un fichier comme quand on active la SDL... Oui mais là... Comment je fais moi pour rediriger mes cout?Exception C0000005 ACCESS_VIOLATION at 62409E84
Alors comme d'ab je fais appel aux ames génreuse et qui en ont pas encore trop mar de moi et de mes questions...
Merci d'avance !
Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu
Sinon tu peux utiliser OutputDebugString() pour tes traces combiné avec le logiciel DebugView.
"L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]
Merci spoutspout pour ta réponse, exactement ce qu'il me fallait et en plus ça s'affiche en direct dans MemProof sans avoir besoin de DebugView qui est tout de même très interessant.
Alors avec les traces que j'ai mis en place j'en arrive à la conclusion que c'est cette ligne qui cause l'erreur d'ACCESS_VIOLATION :
J'ai mis une trace juste au debut de la fonction lectureFichierGPS pour voire si ça venait d'elle mais la trace ne s'affiche pas, cela viens donc de CreateThread(). Bon ok... mais quoi exactement? le pData? mais pourquoi? je vois vraiment pas... Et pourquoi l'application plante avec MemProof et pas quand je la lance normalement?
Code : Sélectionner tout - Visualiser dans une fenêtre à part hThread = CreateThread(NULL, 0, lectureFichierGPS, pData, 0, NULL);
Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu
Je dirais plutôt que ton programme "tombe en marche" quand tu n'utilises pas MemProof
Je pense aussi que c'est le pData qui pose problème, de toute façon à cette ligne je ne vois pas grand chose d'autre...
Montre tout et seulement le code qui utilise ton pData, et on va revoir tout depuis le début....
"L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]
Arf, j'adore l'expression "tombe en marche", tout à fait ça lol !
Alors voici mon code :
Ainsi que le Typedef :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 void listenPort() { PMYDATA pData; string fileName; int port = 1563, sinsize; WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); SOCKET sock; SOCKET csock; SOCKADDR_IN sin; SOCKADDR_IN csin; HANDLE hThread; sock = socket(AF_INET, SOCK_STREAM, 0); sin.sin_addr.s_addr = INADDR_ANY; sin.sin_family = AF_INET; sin.sin_port = htons(port); bind(sock, (SOCKADDR *)&sin, sizeof(sin)); listen(sock, 0); sinsize = sizeof(csin); do { OutputDebugString("Waiting for connection..."); if ((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET) { OutputDebugString("Connection established !"); fileName = attenteInfos(1564, csock); closesocket(csock); } if (fileName != "NOP") { OutputDebugString("File received, current processing file..."); pData = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA)); pData->fileNameLink = strdup(fileName.c_str()); OutputDebugString("Creating thread..."); hThread = CreateThread(NULL, 0, lectureFichierGPS, pData, 0, NULL); OutputDebugString("Thread created !"); OutputDebugString("Closing handle..."); CloseHandle(hThread); OutputDebugString("Handle closed !"); } else { OutputDebugString("File not received, same MD5 !"); } } while (1); closesocket(sock); WSACleanup(); }
Merci spoutspout pour ta patience, un jour j'espère pouvoir moi aussi t'aider... (tu sais faire les pattes?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct MyData { char *fileNameLink; } MYDATA, *PMYDATA;
Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu
Bonjour,
- Pour être sûr, tu devrais rajouter pData=NULL juste après le CreateThread().
- Peux-tu montrer précisément comment tu t'en sers dans le nouveau thread ?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
A priori je vois pas... Le seul point obscur pour moi est le HeapAlloc() que je n'ai jamais utilisé, mais d'après ce que j'ai pu lire dans la MSDN, l'appel a l'air correct.
Néanmoins, j'ai quelques remarques:
J'ai appris par expérience que des erreurs qui n'ont pas l'air peuvent jouer leur rôle dans un plantage.
- Tu ne vérifies jamais le retour de strdup() ou HeapAlloc(). Fais attention, ils peuvent être NULL...
- D'après l'agencement du code, tu peux aller dans le 2e IF de la boucle sans forcément avoir quelque chose dans filename. Ca peut être cause de soucis pour la suite
J'essairais ton code demain dans la soirée, et je te tiens au courant, à moins bien sûr que quelqu'un trouve avant où est l'erreur
"L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]
Ok merci Médinoc et spoutspout je vais rajouter pData = NULL.
Voici comment je me sert de mon pData dans le nouveau thread (en même temps je met tout le code on sait jamais au cas ou vous veriez autre chose... :
Mais bon, le plantage s'effectue avant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 DWORD WINAPI lectureFichierGPS(LPVOID lpParam) { OutputDebugString("Thread launch !"); string nom, utilisateur, constructeur, model, osVersion, cpu, ram, fileName; int maxSofts, x = 1; PMYDATA pData; pData = (PMYDATA)lpParam; fileName = pData->fileNameLink; OutputDebugString("Reading and save file !"); c_inifile_init(fileName.c_str(), NULL); { { char *iniNom =c_inifile_get_string("MACHINE", "NOM", NULL); nom = iniNom; free(iniNom); char *iniUtilisateur = c_inifile_get_string("MACHINE", "UTILISATEUR", NULL); utilisateur = iniUtilisateur; free(iniUtilisateur); char *iniConstructeur = c_inifile_get_string("MACHINE", "CONSTRUCTEUR", NULL); constructeur = iniConstructeur; free(iniConstructeur); char *iniModel = c_inifile_get_string("MACHINE", "MODEL", NULL); model = iniModel; free(iniModel); char *iniOsVersion = c_inifile_get_string("MACHINE", "VERSION OS", NULL); osVersion = iniOsVersion; free(iniOsVersion); char *iniCpu = c_inifile_get_string("MACHINE", "CPU", NULL); cpu = iniCpu; free(iniCpu); char *iniRam = c_inifile_get_string("MACHINE", "RAM", NULL); ram = iniRam; free(iniRam); char *maxSoftsTmp = c_inifile_get_string("SOFTS", "TOTAL", NULL); maxSofts = strtol(maxSoftsTmp, NULL, 0); free(maxSoftsTmp); } string listSofts[maxSofts]; for (x=1 ; x<=maxSofts ; x++) { char ch[3]; sprintf(ch, "%d", x); char * iniStr = c_inifile_get_string("SOFTS", ch, NULL); listSofts[x-1] = iniStr; free(iniStr); } if (verifExistOracle(nom) == 1) suppExistOracle(nom); if (insertDbOracleInfosDiv(nom, utilisateur, constructeur, model, osVersion, cpu, ram) != 0) OutputDebugString("Erreur lors de l'enregistrement dans la BDD Oracle \"insertDbOracleInfosDiv()\""); if (insertDbOracleSofts(nom, listSofts, maxSofts) != 0) OutputDebugString("Erreur lors de l'enregistrement dans la BDD Oracle \"insertDbOracleSofts()\""); } c_inifile_close(); HeapFree(GetProcessHeap(), 0, pData); OutputDebugString("Thread finished !"); return 0; }Donc le thread n'est même pas lancé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part OutputDebugString("Thread launch !");
pour le 2ème if j'ai modifié :
Mais ça ne compile pas...normal mais que mettre à la place...
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (fileName != "NOP" || fileName != NULL)
Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu
Pour le 2e If:
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (fileName != "NOP" && !fileName.empty())
"L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]
paf! pourquoi j'ai voulu mettre "||"???? arf! merci encore spoutspout !
Faut absolument que j'aprenne les attributs des string genre .empty, .lenght etc..
Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu
Je crois que j'ai trouvé... CreateThread() attend un pointeur sur une routine à lancer. Essaye donc plutôt ça:L'erreur n'aurait donc rien à voir avec le pData.
Code : Sélectionner tout - Visualiser dans une fenêtre à part hThread = CreateThread(NULL, 0, &lectureFichierGPS, pData, 0, NULL);
"L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]
Attention aussi, dans ton thread tu oublies le free(pData->fileNameLink), pData->fileNameLink=NULL avant l'appel à HeapFree()...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Au fait, je n'avais pas vu ça, mais vu que ton programme utilise la bibliothèque runtime C et C++, tu devrais lancer ton thread avec _beginthreadex() au lieu de CreateThread()...
(attention, une fonction passée à _beginthreadex() doit retourner un UINT au lieu d'un DWORD).
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Eu medinoc... il me dit que _beginthreadex() n'est pas déclaré, ça marche cette fonction avec un compilo autre que celui de vc++?
Ca pose un réel problème d'utiliser CreateThread()?
J'ai bien rajouter la libération de pData comme tu me l'a montré...
Merci spouspout pour l'info ! Mais ça gauffre toujours au meme endroit...
Edito : Si ça peut aider il y a un truc que je trouve bizar, quand j'execute normalement mon prog j'ai 1 seul thread ans le gestionnaire des taches, mais quand j'execute exactement le même exe avec MemProof il y en a 4...
Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager