IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème : erreur de segmentation.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Par défaut Problème : erreur de segmentation.
    Bonjour à tous.
    J'utilise une class externe dans mon programme (nommé "UsbHID") qui me permet d'accéder à un périphérique USB.

    Voici le header :
    Code C++ : 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
    #if defined(WIN32)
    
    #include <windows.h>
    #include <setupapi.h>
    extern "C" {
    #include <hidsdi.h>
    }
    
    #endif
    
    namespace CyberGarage {
    
    class UsbHID
    {
    private:
    
    #if defined(WIN32)
    	SP_DEVICE_INTERFACE_DETAIL_DATA *mDevIfDetailData;
    	HANDLE mDevHandle;
    	HIDD_ATTRIBUTES mDevAttr;
    	HIDP_CAPS mDevCaps;
    	HANDLE  mDevEvent;
    	OVERLAPPED mOverLapped;
    	unsigned char *mInputBuf;
    	unsigned char *mOutputBuf;
    #endif
    
    public:
    
    	UsbHID();
    	virtual ~UsbHID();
    
    	bool open(int venderID, int productID);
    	bool close();
    
    	bool isConnected() 
    	{
    		return (mDevHandle ? true : false);
    	}
    
    	int read();
    	int write(unsigned char *data, int dataLen);
    
        //...Code inutile...
    
    #if defined(WIN32)
    	void GetLastError();
    #endif
    };
    
    }
    
    #endif

    J'ai remarqué que la fonction qui me pose problème est "open()" : elle me provoque une erreur de segmentation.
    Voici le rapport du debugger
    Code TXT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #0 0000D514	??() (??:??)
    #1 00401508	??() (??:??)
    #2 0022FED0	??() (??:??)
    #3 0022FC1C	??() (??:??)
    #4 41416161	??() (??:??)
    #5 0022FE6C	??() (??:??)
    #6 7C91EE18	strchr() (C:\WINDOWS\system32\ntdll.dll:??)
    #7 7C9206F0	ntdll!RtlAppendStringToString() (C:\WINDOWS\system32\ntdll.dll:??)
    #8 FFFFFFFF	??() (??:??)
    #9 7C9206EB	ntdll!RtlAppendStringToString() (C:\WINDOWS\system32\ntdll.dll:??)
    #10 77BFC3C9	msvcrt!free() (C:\WINDOWS\system32\msvcrt.dll:??)
    #11 003D0000	??() (??:??)
    #12 40000060	??() (??:??)
    #13 77BFC3CE	msvcrt!free() (C:\WINDOWS\system32\msvcrt.dll:??)
    #14 00000000	??() (??:??)

    Pourtant d'après le développeur, ça version est stable.
    Donc je ne voie pas pourquoi cette erreur survient ??

















    Code de la fonction open() qui est plutôt costaud
    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
    bool UsbHID::open(int venderID, int productID)
    {
    	close();
     
    	GUID guid;
    	HidD_GetHidGuid(&guid);
     
    	HDEVINFO devInfoSet = SetupDiGetClassDevs(&guid, 0, 0, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ));
    	if (devInfoSet == INVALID_HANDLE_VALUE)
    		return false;
     
    	SP_DEVICE_INTERFACE_DATA devIf;
    	devIf.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    	for (int i=0; SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &guid, i, &devIf); i++) {
    		DWORD devIfDetailSize = 0;
    		SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, NULL, 0, &devIfDetailSize, 0);
    		if (devIfDetailSize <=0)
    			continue;
    		SP_DEVICE_INTERFACE_DETAIL_DATA *devIfDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(devIfDetailSize);
    		devIfDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
    		if (SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, devIfDetail, devIfDetailSize, &devIfDetailSize, 0) != 0) {
    			HANDLE devHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    			if(devHandle == INVALID_HANDLE_VALUE) {
    				free(devIfDetail);
    				continue;
    			}
    			HIDD_ATTRIBUTES devAttr;
    			if (!HidD_GetAttributes(devHandle, &devAttr)) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			PHIDP_PREPARSED_DATA devPreData;
    			if (!HidD_GetPreparsedData(devHandle, &devPreData )) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			HIDP_CAPS devCaps;
    			if (HidP_GetCaps(devPreData, &devCaps ) != HIDP_STATUS_SUCCESS ) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			CloseHandle(devHandle);
    			if (devAttr.VendorID == venderID && devAttr.ProductID == productID) {
    				mDevHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    				SetupDiDestroyDeviceInfoList(devInfoSet);
    				memcpy(&mDevAttr, &devAttr, sizeof(HIDD_ATTRIBUTES));
    				memcpy(&mDevCaps, &devCaps, sizeof(HIDP_CAPS));
    				mInputBuf = (unsigned char *)malloc(mDevCaps.InputReportByteLength);
    				mOutputBuf = (unsigned char *)malloc(mDevCaps.OutputReportByteLength);
    				return true;
    			}
    		}
    		free(devIfDetail);
    	}
     
    	SetupDiDestroyDeviceInfoList(devInfoSet);
     
    	return false;
    }

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    quel debugger utilises-tu?

    Dans tous les cas, si tu désactive les optimisations lors de la compilation, et que tu actives les options de debuggage ( profile code, debugging symbols), tout ça dans les options de compilation, tu auras des informations beaucoup plus précises sur le plantage.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Par défaut
    Bah j'utilise le tout simple debugger de code::blocks.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    Fait nous un vrai rapport de bug : ou se produit l'erreur exactement (ou va pas faire le boulot a ta place) le stack trace avec les noms des fonctions, c'est mieux, avec un -Wall dans les paramètres de compilation, ca donne des infos ?

    Bref, aide toi toi même en nous aidant.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Par défaut
    Je viens d'avancer dans mon erreur : après une série de plusieurs petit tests,
    J'ai trouvé la fonction à la base de l'erreur (dans la fonction open() )
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool UsbHID::open(int venderID, int productID)
    {
    	close();
     
    	GUID guid;
    	HidD_GetHidGuid(&guid);
     
         // Code sans problème
    }

    et j'ai trouvé son prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __stdcall
    HidD_GetHidGuid (
       OUT   LPGUID   HidGuid
       );

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    QUE TU DIS LA COMPILATION AVEC WALL ???

    QUE DONNE LE STACK TRACE AVEC LES NOMS A LA PLACE DES ???? (Options de compilation).

    D'ou sort cette fonction HidD_GetHidGuid ? Est-elle fiable ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Par défaut
    Merci de prendre du temps à mon problème deadalnix.

    Alors j'ai bien mis le paramètre -Wall dans "debugger initialization commands", mais ça ne change rien au rapport. Je pense que ça vient du fait que la fonction se trouve dans un .a

    Oui elle devrait être fiable, car elle proviens de la DDK (- Windows Driver Development Kit)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. erreur de segmentation , probléme de compilation
    Par henda333 dans le forum C++
    Réponses: 1
    Dernier message: 18/06/2014, 21h19
  2. Problème d'erreur de segmentation
    Par vinassefranche dans le forum C
    Réponses: 6
    Dernier message: 02/06/2014, 18h59
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo