Plantage sous Intel (pas PPC) (pas le meme que le précédent pos)

groumpfgroumpf Membre
10:11 modifié dans Vos applications #1
Bon alors voila j'essaye de porter mes applis sous Intel. Actuellement j'ai semble-t-il un problème d'affichage de la fenètre de préférence et c'est là  qu'on positionne les entrées/sorties MIDI.
Si vous voulez tester c'est sur http://dqueffeulou.free.fr/beta/ (on va encore me taxer de double post...).
Voici les traces que j'ai récupéré de testeurs de MacMusic (ben oui c'est des applis pour les musiciens).

2007-07-12 23:09:09.082 ObieEditor[448] *** -[NSBundle load]: Error loading code /Users/mathiasroemer/Library/InputManagers/Smart Crash Reports/Smart Crash Reports.bundle/Contents/MacOS/Smart Crash Reports for bundle /Users/mathiasroemer/Library/InputManagers/Smart Crash Reports/Smart Crash Reports.bundle, error code 2 (link edit error code 0, error number 0 ())
2007-07-12 23:09:19.720 ObieEditor[448] *** Assertion failure in -[NSMenu itemAtIndex:], Menus.subproj/NSMenu.m:713
2007-07-12 23:09:19.806 ObieEditor[448] Invalid parameter not satisfying: (index >= 0) && (index < (_itemArray ? CFArrayGetCount((CFArrayRef)_itemArray) : 0))
Jul 12 23:10:22 Mon-Machin crashdump[452]: ObieEditor crashed
Jul 12 23:10:23 Mon-Machin crashdump[452]: crash report written to: /Users/mathiasroemer/Library/Logs/CrashReporter/ObieEditor.crash.log
2007-07-12 23:10:28.580 ObieEditor[454] *** -[NSBundle load]: Error loading code /Users/mathiasroemer/Library/InputManagers/Smart Crash Reports/Smart Crash Reports.bundle/Contents/MacOS/Smart Crash Reports for bundle /Users/mathiasroemer/Library/InputManagers/Smart Crash Reports/Smart Crash Reports.bundle, error code 2 (link edit error code 0, error number 0 ())
2007-07-12 23:10:42.842 ObieEditor[454] *** Assertion failure in -[NSMenu itemAtIndex:], Menus.subproj/NSMenu.m:713
2007-07-12 23:10:42.938 ObieEditor[454] Invalid parameter not satisfying: (index >= 0) && (index < (_itemArray ? CFArrayGetCount((CFArrayRef)_itemArray) : 0))


Cette trace à  un rapport avec les menus mais je ne trouve nul part dans la doc Apple de différences Intel/PPC concernant les NIB ou les menus, donc je n'avance pas beaucoup.
Le problème d'ouverture des préférences est finalement le plus gros problème car le 2nd plantage est peut-etre une conséquence de l'état incertain des I/O MIDI (qui n'ont pas été configurés).


Sinon j'ai eu ca aussi :

Exception:  EXC_ARITHMETIC (0x0003)
Codes:      EXC_I386_DIV (divide by zero)

Thread 4 Crashed:
0  libgcc_s.1.dylib              0x90bd59b5 __udivdi3 + 321
1  com.apple.audio.midi.CoreMIDI  0x968126b1 SysexSender::RunTask(unsigned long long) + 581
2  com.apple.audio.midi.CoreMIDI  0x96811f64 Task::Run() + 90
3  com.apple.audio.midi.CoreMIDI  0x96811d1b XThread::RunHelper(void*) + 17
4  com.apple.audio.midi.CoreMIDI  0x96819617 CAPThread::Entry(CAPThread*) + 93
5  libSystem.B.dylib              0x90024227 _pthread_body + 84

Donc il semble que ce soit une division par 0.
J'ai étudié mon code et je ne vois pas d'endroit ou je fais des divisions. D'ailleurs le plantage à  un rapport avec SysexSender qui est une méthode de l'API CoreMIDI (que je n'appelle pas, du moins pas directement).
J'ai aussi étudié mes modulos (%) et je n'utilise que des constantes.

Si quelqu'un a des idées je suis preneur
Merci.

Réponses

  • BruBru Membre
    10:11 modifié #2
    dans 1184408074:

    (on va encore me taxer de double post...).

    Je ne suis pas rancunier...

    Sinon,

    Une question : utilises-tu les bindings pour la gestion du pref panel ? (a priori non).
    Une demande : poste le code que tu utilises pour remplir les 2 popupButton (input port et output port).

    .
  • groumpfgroumpf Membre
    10:11 modifié #3
    dans 1184436543:

    dans 1184408074:

    (on va encore me taxer de double post...).

    Je ne suis pas rancunier...


    je me disais aussi avec un nombre de messages > 1500 :-)

    Alors non les bindings en fait je ne sais pas vraiment ce que c'est, j'utilise des connections à  partir de IB.

    Sinon le code qui initialise les préférences:
    - (void)windowDidLoad<br />{<br />	NSArray *oInputs = [[MIDIDriver sharedInstance] midiInputs];<br />	[midiInputPort removeAllItems];<br />	[midiInputPort addItemsWithTitles:oInputs];<br />	[midiInputPort selectItemAtIndex:[[MIDIDriver sharedInstance] inputPortNumber]];<br />	NSArray *oOutputs = [[MIDIDriver sharedInstance] midiOutputs];<br />	[midiOutputPort removeAllItems];<br />	[midiOutputPort addItemsWithTitles:oOutputs];<br />	[midiOutputPort selectItemAtIndex:[[MIDIDriver sharedInstance] outputPortNumber]];<br />	<br />	bool oSendOnOpen = [[NSApp delegate] sendPatchOnOpen];<br />	[sendPatchOnOpen setState:(oSendOnOpen ? NSOnState : NSOffState)];<br />}
    


    En fait je suis en train de me dire que le problème vient peut-etre du selectItemAtIndex si le inputPortNumber vaut n'importe quoi au démarrage, ça risque de planter.
    Est-ce que les int valent 0 par défaut ?
    Il faudrait aussi que je m'assure qu'il y a au moins un item dans la liste...

  • orfaitorfait Membre
    10:11 modifié #4
    il me semble qu'un int vaut nil par défaut.
  • BruBru Membre
    10:11 modifié #5
    dans 1184492836:

    il me semble qu'un int vaut nil par défaut.


    int n'est pas un object. int est un numérique.


    dans 1184438010:

    Est-ce que les int valent 0 par défaut ?


    En tant que type basique (en C), int n'est pas initialisé lorsqu'il est déclaré : il a comme valeur ce qui se trouve en mémoire au moment où il son emplacement est créé.

    Par contre, un int dans une interface de classe Obj-C vaudra toujours 0 (zéro) à  la création de l'objet (car le runtime Obj-C met toute la structure de l'objet à  0 au moment du alloc).

    .
  • BruBru Membre
    juillet 2007 modifié #6
    Bon, je problème vient bien des NSPopupButton.

    En fait, tu effaces le contenu des popup (par un removeAllItems).
    Ensuite tu remplis ce popup et tu sélectionnes un des items nouvellement ajoutés.
    Mais, si la méthode de remplissage des items (ici midiInputs ou midiOutputs) ne renvoie rien (le tableau reste vide), tu tentes tout de même de sélectionner un item qui n'existe pas. Dans ce cas, NSMenu (celui attaché au popup) lève une exception (ce qui provoque le message dans la console), et stoppe le reste de l'exécution du code (donc pas d'affichage de fenêtre).

    Donc, le problème pour les intel se situe au niveau de la classe MIDIDriver (dont nous ignorons le code), et plus particulièrement dans les méthodes midiInputs et midiOutputs qui ne renvoient pas le NSArray attendu sous intel.

    Tu peux temporairement réparé ton code par un
    <br />if (oInputs!=nil &amp;&amp; [oInputs count]&gt;0)<br /> {<br />&nbsp; &nbsp; [midiInputPort selectItemAtIndex:[[MIDIDriver sharedInstance] inputPortNumber]];<br />}
    

    afin de ne  faire le selectItemAtIndex que si tu as bien remplis le popup.

    .
  • groumpfgroumpf Membre
    10:11 modifié #7
    Effectivement mon code n'était pas très carré, je l'ai modifié comme ça:

    - (void)windowDidLoad<br />{<br />	NSArray *oInputs = [[MIDIDriver sharedInstance] midiInputs];<br />	[midiInputPort removeAllItems];<br />	printf(&quot;inputs %d&#092;n&quot;, [oInputs count]);<br />	printf(&quot;inputPortNumber %d&#092;n&quot;, [[MIDIDriver sharedInstance] inputPortNumber]);<br />	<br />	if ([oInputs count] &gt; 0 &amp;&amp; [[MIDIDriver sharedInstance] inputPortNumber] &lt; [oInputs count])<br />	{<br />		[midiInputPort addItemsWithTitles:oInputs];<br />		[midiInputPort selectItemAtIndex:[[MIDIDriver sharedInstance] inputPortNumber]];<br />	}<br />	else<br />	{<br />		[midiInputPort addItemWithTitle:@&quot;no input&quot;];<br />	}<br />	NSArray *oOutputs = [[MIDIDriver sharedInstance] midiOutputs];<br />	[midiOutputPort removeAllItems];<br />	printf(&quot;outputs %d&#092;n&quot;, [oOutputs count]);<br />	printf(&quot;inputPortNumber %d&#092;n&quot;, [[MIDIDriver sharedInstance] outputPortNumber]);<br />	<br />	if ([oOutputs count] &gt; 0 &amp;&amp; [[MIDIDriver sharedInstance] outputPortNumber] &lt; [oOutputs count])<br />	{<br />		[midiOutputPort addItemsWithTitles:oOutputs];<br />		[midiOutputPort selectItemAtIndex:[[MIDIDriver sharedInstance] outputPortNumber]];<br />	}<br />	else<br />	{<br />		[midiOutputPort addItemWithTitle:@&quot;no output&quot;];<br />	}<br />	bool oSendOnOpen = [[NSApp delegate] sendPatchOnOpen];<br />	[sendPatchOnOpen setState:(oSendOnOpen ? NSOnState : NSOffState)];<br />}
    


    En fait MIDIDriver est une de mes classes, j'ai vérifié, les méthodes créent systématiquement un tableau donc éventuellement vide. La modif permet de ne pas planter si le fichier de préférences contient des valeurs qui ne correspondent plus à  la config MIDI actuelle.
    J'ai initialisé mes ports à  0 dans l'init de MIDIDriver.

    J'ai mis à  jour le prog sur mon site.
    Au fait Bru tu as un MacIntel ?
  • BruBru Membre
    10:11 modifié #8
    dans 1184494781:

    Au fait Bru tu as un MacIntel ?


    Oui, et un G5 aussi (voir ce fil pour l'histoire).

    dans 1184494781:

    Effectivement mon code n'était pas très carré, je l'ai modifié comme ça:


    Maintenant, c'est OK (aussi bien sur le intel que sur le G5 qui plantait pour les mêmes raisons).
    Juste pour le cosmétique : ajoute un setEnabled:NO au popup en plus du "no input".

    .
  • groumpfgroumpf Membre
    10:11 modifié #9
    J'ai ajouté le setEnabled.
    Merci encore pour ton aide, j'essaierai de me limiter à  un forum la prochaine fois (ce que je fais d'habitude).
    Du coup je vais revoir mes autres applis qui doivent utiliser à  peu près le même code...
  • BruBru Membre
    10:11 modifié #10
    dans 1184504851:

    j'essaierai de me limiter à  un forum la prochaine fois (ce que je fais d'habitude).


    mise à  part MacMusic/440forums peut-être...

    .
  • groumpfgroumpf Membre
    10:11 modifié #11
    dans 1184505994:

    dans 1184504851:

    j'essaierai de me limiter à  un forum la prochaine fois (ce que je fais d'habitude).


    mise à  part MacMusic/440forums peut-être...

    .


    Je poste sur MacMusic mais en général sur des sujets liés directement à  la musique.  Pour tester l'appli je me suis dis qu'il y aurait plus de chance d'avoir des gens avec du MIDI. Ensuite pour les aspects code c'est plutot ici que je viens car le forum dev sur MacMusic n'est pas très actif et ne concerne pas vraiment  la programmation pure.
Connectez-vous ou Inscrivez-vous pour répondre.