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++/CLI Discussion :

phénomène bizarre observé sur une machine


Sujet :

C++/CLI

  1. #1
    Membre régulier
    phénomène bizarre observé sur une machine
    Bonjour j'observe sur une machine XP unique et ancienne (Service pack 3) un phénomène mystérieux sur un projet CLR/CLI (net framework 4.0),
    j'ai essayé sur une autre machine xp virtuel , pas de problème , ça passe nickel.
    Voila la fonction initwave crashe sur la ligne THSound ts={0};.
    Quand je remplace THSound ts={0}; par THSound ts; ça passe (pas de crash).
    Quand je remplace ceux-ci par memset(&ts,0,sizeof(THSound)); ça crashe.
    J'ai remplacé ceux-ci par un new THSound et un delete à la fin , ça passe (pas de crash).
    Pourquoi ????


    La fonction msg est ma fonction qui affiche un messagebox pour debugger ben oui.

    Je ne comprend pas ce phénomène bizarre.
    L'exception (crash) à lieu dans une zone non managée.

    Ça m'intrique ce genre de phénomène.
    Windows XP Service Pack 3.

    Voici un bout de code :
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    #pragma unmanaged
    typedef enum {
    	mono,
    	stereo
    }THSound_Channel;
    typedef bool (*E_HS)(void *HSound,void *param,short **u,int *sz);
    typedef bool (*E_ENDHS)(void *HSound,void *param,short *u,int sz);
    typedef struct {
    	int sizecb;
    	struct {
    	DWORD freq;
    	DWORD bufko;
    	THSound_Channel channel;
    	char bits;
     
    	HANDLE hLic; 
    	HANDLE hEvent;
     
    	void *param;
    	E_HS devent;
    	E_ENDHS endev;
     
    	char nbuf;
    	}in;
    }THSound,*PHSound;
     
     
    bool endev(void *HSound, void *param, short *u, int sz)
    {
    	delete u;
    	return true;
    }
     
    //la fonction devent est dans une zone managé
     
    void msg(char* s);
     
    #include "e:/communlib/types_wave.h"
     
    //fonctionne
    void* initwave(int sample, int bits, int channel,char *name,int &mcierror, void *paramclass)
    {
    	msg("InitWave1");
    	void *ret = nullptr;
    	if (_HSound_Load())
    	{
    		msg("InitWave2");
    		msg("InitWave2x0");
    		THSound ts;
    		msg("InitWave2x1");
    		ts.sizecb = sizeof(ts);
    		msg("InitWave2x2");
    		ts.in.bits = bits;
    		ts.in.channel = channel==1? THSound_Channel::mono:THSound_Channel::stereo;
    		ts.in.nbuf = 4;
    		msg("InitWave2x3");
    		ts.in.param = paramclass;
    		msg("InitWave2x4");
    		ts.in.devent = devent;
    		ts.in.endev = endev;
    		msg("InitWave2x5");
    		ts.in.bufko = 128 * 1024;
    		ts.in.freq = sample;
    		msg("InitWave2x6");
    		msg("InitWave3");
    		ret = _HSound_Init(&ts, &mcierror, name);
    		msg("InitWave4");
    		if (ret != nullptr)
    		{
    			msg("InitWave5");
    			_HSound_SetAcquireBuffer(ret, true, false);
    			msg("InitWave6");
    			_HSound_Padding(ret);
    			msg("InitWave7");
    		}
    		msg("InitWave8");
    	}
    }
     
     
    //crash
    void* initwave(int sample, int bits, int channel,char *name,int &mcierror, void *paramclass)
    {
    	msg("InitWave1");
    	void *ret = nullptr;
    	if (_HSound_Load())
    	{
    		msg("InitWave2");
    		msg("InitWave2x0");
    		THSound ts={0};
    		msg("InitWave2x1");
    		ts.sizecb = sizeof(ts);
    		msg("InitWave2x2");
    		ts.in.bits = bits;
    		ts.in.channel = channel==1? THSound_Channel::mono:THSound_Channel::stereo;
    		ts.in.nbuf = 4;
    		msg("InitWave2x3");
    		ts.in.param = paramclass;
    		msg("InitWave2x4");
    		ts.in.devent = devent;
    		ts.in.endev = endev;
    		msg("InitWave2x5");
    		ts.in.bufko = 128 * 1024;
    		ts.in.freq = sample;
    		msg("InitWave2x6");
    		msg("InitWave3");
    		ret = _HSound_Init(&ts, &mcierror, name);
    		msg("InitWave4");
    		if (ret != nullptr)
    		{
    			msg("InitWave5");
    			_HSound_SetAcquireBuffer(ret, true, false);
    			msg("InitWave6");
    			_HSound_Padding(ret);
    			msg("InitWave7");
    		}
    		msg("InitWave8");
    	}
    }


    Bizarre.

    Merci.

  2. #2
    Expert éminent sénior
    Il dit quoi le débogueur ?
    En particulier, d'où vient le pointeur foireux.

  3. #3
    Expert éminent sénior
    En effet, ça devrait passer aussi avec le memset ou ={0} vu que ta structure semble être POD.

    Comme dit bacelar, essaie d'avoir plus d'infos sur l'erreur d'accès mémoire: L'adresse fautive, si c'est en lecture ou en écriture...
    Mais ça va nécessiter soir le debugger, soit du Structured Exception Handling dans ton code non-managé, parce que AccessViolationException ne contient pas ces informations.
    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.

  4. #4
    Membre régulier
    J'ai remplacé par des pointers 'new' et 'delete' et je n'ai plus ce probléme.

  5. #5
    Expert éminent sénior
    Si c'est "tombé en marche", alors le comportement indéfini est toujours là quelque part, comme un incendie qui couve.
    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.

###raw>template_hook.ano_emploi###