Plantage Intel mais pas PPC ...

hdexhdex Membre
13:43 modifié dans Vos applications #1
Apres avoir cree un petit soft pour recuperer des infos d'une badgeuse que ma boite utilise, j'ai adapte mon programme pour faire la meme chose sur les boitiers de Telephonie par Internet de chez Sipura/LinkSys.

VoIP Tracker Lite est donc ne.

Le probleme c'est que j'ai un utilisateur sous Mac Intel pour qui ca plante. D'apres le crash log, ca ressemble a un probleme d'allocations memoire :
Exception:&nbsp; EXC_BAD_ACCESS (0x0001)<br />Codes:&nbsp; &nbsp; &nbsp; KERN_INVALID_ADDRESS (0x0001) at 0x0e2ffff0<br /><br />Thread 0 Crashed:<br />0&nbsp;  &lt;&lt;00000000&gt;&gt; 	0xffff0f26 __memcpy + 1926 (cpu_capabilities.h:228)<br />1&nbsp;  com.apple.CoreFoundation&nbsp; &nbsp; &nbsp;  	0x9080c44c __CFStringCreateImmutableFunnel3 + 1757<br />2&nbsp;  com.apple.CoreFoundation&nbsp; &nbsp; &nbsp;  	0x90817938 CFStringCreateWithSubstring + 585<br />3&nbsp;  com.apple.Foundation&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  	0x927e39ee -[NSCFString substringWithRange:] + 185<br />4&nbsp;  ...rkhatsoft.VoIP Tracker Lite 	0x00003a2b -[HDSPAHelperTools parseScanEngine:skippinguntil:capturinguntil:] + 230<br />5&nbsp;  ...rkhatsoft.VoIP Tracker Lite 	0x00003598 -[HDSPAHelperTools probeVOIPDevice:voipSettingsObject:] + 681<br />6&nbsp;  ...rkhatsoft.VoIP Tracker Lite 	0x00002819 -[HDSPAHelperAppController startRegularProbe:] + 165


Le truc que je comprends pas bien, c'est que si l'utilisateur force mon appli a utiliser Rosetta ... tout baigne.
J'aurais penser qu'un probleme d'allocation memoire n'est pas specifique a l'architecture ... j'ai loupe un episode ou quoi ?

Réponses

  • tabliertablier Membre
    13:43 modifié #2
    D'apres le crash log, ca ressemble a un probleme d'allocations memoire :


    Pas forcément, ça peut venir de l'utilisation d'un pointeur qui est à  une valeur idiote également. C'était un bug courant en Pascal.
  • BruBru Membre
    13:43 modifié #3
    Sans code, c'est difficile de pouvoir deviner quelque chose.

    Il y a des différences de traitements des exceptions du proc entre ppc et intel (par exemple, la division par 0 qui plante un prog intel, mais qui ne fait rien sous ppc).

    Ici, le crash log suggère :
    - soit un problème d'allocation mémoire (plus assez de ram par exemple).
    - soit des paramètres passés à  memcpy qui sont tarés.

    Dans le second cas, il faut revenir à  ce qui est utilisé comme range dans le -[NSCFString substringWithRange:] (des valeurs du range qui sont bizarres peuvent conduire à  un mauvais calcul des pointeurs lors de l'allocation du buffet qui servira de résultat au substring).

    .
  • CéroceCéroce Membre, Modérateur
    13:43 modifié #4
    dans 1184226787:

    l'allocation du buffet.


    Miam!  :p
  • hdexhdex Membre
    13:43 modifié #5
    Merci Bru ... voici le code qui a priori pose probleme

    - (NSString *)probeVOIPDevice:(NSString *)voipDeviceIP voipSettingsObject:(HDVoipDeviceValues *)voipDeviceSetting<br />{ //Probe VoIP Device, strip HTML Flags <br />NSAutoreleasePool *probeAndParsePool = [[NSAutoreleasePool alloc] init];<br /><br />NSError *theError = NULL;<br />// Building URL to VoIP Device<br />NSString *voipDeviceUrlString = [@&quot;http://&quot; stringByAppendingString:voipDeviceIP];<br />NSURL *voipDeviceURL = [NSURL URLWithString:voipDeviceUrlString];<br /><br />NSXMLDocument *xmlConversionDocument = [[NSXMLDocument alloc] initWithContentsOfURL:voipDeviceURL options:NSXMLDocumentTidyHTML error:&amp;theError];<br />if (xmlConversionDocument == nil || theError == NULL) <br />	{<br />		[self vtAlert:@&quot;Unable to access VoIP Device&quot; textAlert:@&quot;Unable to access device. Please check the IP address or hostname&quot;];<br />		return(@&quot;error&quot;);<br /><br />	}<br /><br />NSString *theXSLTString = @&quot;&lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?&gt;&lt;xsl:stylesheet version=&#39;1.0&#39; xmlns:xsl=&#39;http://www.w3.org/1999/XSL/Transform&#39; xmlns:xhtml=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;xsl:output method=&#39;text&#39;/&gt;&lt;xsl:template match=&#39;xhtml:head&#39;&gt;&lt;/xsl:template&gt;&lt;xsl:template match=&#39;xhtml:script&#39;&gt;&lt;/xsl:template&gt;&lt;/xsl:stylesheet&gt;&quot;;<br />NSData *xmlConvertedData = [xmlConversionDocument objectByApplyingXSLTString:theXSLTString arguments:NULL error:&amp;theError];<br />NSString *strippedHTML = [[NSString alloc] initWithData:xmlConvertedData encoding:NSUTF8StringEncoding];<br /><br />NSScanner *parsingScanner = [NSScanner scannerWithString:strippedHTML];<br /><br />NSDictionary *settingsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;DHCP:&quot; capturinguntil:@&quot;Current IP:&quot;],@&quot;dhcp&quot;, <br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Current Netmask:&quot; capturinguntil:@&quot;Current Gateway:&quot;],@&quot;netmask&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Current Gateway:&quot; capturinguntil:@&quot;Primary DNS:&quot;],@&quot;gateway&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Primary DNS:&quot; capturinguntil:@&quot;Secondary DNS:&quot;],@&quot;dns&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Product Name:&quot;capturinguntil:@&quot;Serial Number:&quot;],@&quot;productname&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Serial Number:&quot; capturinguntil:@&quot;Software Version:&quot;],@&quot;serialnumber&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Software Version:&quot; capturinguntil:@&quot;Hardware Version:&quot;],@&quot;swversion&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Hardware Version:&quot; capturinguntil:@&quot;MAC Address:&quot;],@&quot;hwversion&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;MAC Address:&quot; capturinguntil:@&quot;Client Certificate:&quot;],@&quot;macaddress&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Elapsed Time:&quot; capturinguntil:@&quot;Broadcast Pkts Sent:&quot;],@&quot;uptime&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Registration State:&quot; capturinguntil:@&quot;Last Registration At:&quot;],@&quot;registrationstatus&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Last Registration At:&quot; capturinguntil:@&quot;Next Registration In:&quot;],@&quot;registrationrenewal&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Next Registration In:&quot; capturinguntil:@&quot;Message Waiting:&quot;],@&quot;timetorenew&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Last Called Number:&quot; capturinguntil:@&quot;Last Caller Number:&quot;],@&quot;lastcallednumber&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Call 1 State:&quot; capturinguntil:@&quot;Call 2 State:&quot;],@&quot;voipstatus&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;Call 1 Encoder:&quot; capturinguntil:@&quot;Call 2 Encoder:&quot;],@&quot;codec&quot;,<br />						[self parseScanEngine:parsingScanner skippinguntil:@&quot;PSTN State:&quot; capturinguntil:@&quot;VoIP Tone:&quot;],@&quot;pstnstatus&quot;, <br />						nil];<br /><br />[voipDeviceSetting setProperties:settingsDictionary];<br /><br /><br />[xmlConversionDocument release];<br />[strippedHTML release];<br />[probeAndParsePool release];<br />return(@&quot;ok&quot;);<br />}<br /><br />-(NSString *)parseScanEngine:(NSScanner *)scanner skippinguntil:(NSString *)skippedString capturinguntil:(NSString *)getuptoString<br />{ <br />//NSLog(@&quot;Parsing %@&quot;,skippedString);<br />// Set NSScanner position<br />if (![skippedString isEqualToString:@&quot;&quot;]) [scanner scanUpToString:skippedString intoString:NULL]; <br /><br />NSString *scanresult; <br />[scanner scanUpToString:getuptoString intoString:&amp;scanresult]; <br />scanresult= [scanresult substringWithRange: NSMakeRange([skippedString length]+1,[scanresult length]-([skippedString length]+1))]; <br /><br />return scanresult; <br />}
    


    probeVoIPDevice commence par contacter le boitier, virer les balises HTML et lance le parsing via parseScanEngine. Le tout est stocke dans un NSDic.

    Je me dis que soit c'est mon parsing qui deconne  (mais alors pourquoi j'ai qu'un seul utilisateur Intel qui s'en plaint, c'est encore un mystère) ou c'est mes release.

    Je vais continuer à  chercher, si vous avez des idées je suis preneur  :o
  • AliGatorAliGator Membre, Modérateur
    13:43 modifié #6
    Heu je parcours mais alors très vite ton code, mais y'a qd même un truc qui m'a paru bizarre...

    [tt]if (xmlConversionDocument == nil || theError == NULL)[/tt] ???
    Tu as un problème (et tu dois alors retourner @error *) si, soit xmlConversionDocument est nil en effet... soit si theError n'est pas NULL mais est une NSError avec un code d'erreur et un message et tout, non ?

    S'il y a eu une erreur, il te retourne ladite erreur dans theError, donc theError != NULL, donc le contraire de ton test...

    Enfin moi ce que j'en dis...

    *Entre nous, retourner la chaà®ne @error pour indiquer une erreur c'est moyen comme concept de gestion des erreurs. Mais bon, passons.
  • hdexhdex Membre
    13:43 modifié #7
    :o :o
    Effectivement Ali, c'est un peu le contraire que mon test devrait faire... je vois vraiment pas pourquoi j'ai laisse ca comme ca ... un peu trop de  :p

    Pour ce qui est de @error c'est effectivement un peu spartiate. Pour le moment si @error est retourne, un message d'erreur s'affiche indiquant qu'il y a un probleme pour contacter le boitier.
    C'est un peu generique, mais  c'est ce que j'ai trouve de plus parlant pour l'utilisateur (NSError retourne "zero byte ressource" sinon)
  • hdexhdex Membre
    13:43 modifié #8
    Bon on continue dans l'etrange. J'ai modifie mon parseScanEngine, au lieu de faire de faire des manips sur les taille de chaine de caracteres j'utilise componentsSeparatedByString avec ":" comme delimiteur (coup de bol qu'il y ait un delimiteur).

    Ca semble plus rapide et ca ne plante plus MAIS (ben oui faut bien un mais) les infos ne s'affiche pas correctement (pas de soucis sous Rosetta/PPC).

  • AliGatorAliGator Membre, Modérateur
    13:43 modifié #9
    Heu en mm temps si tu pouvais être plus précis et nous fournir un bout de code?
    Parce que là  bon, on n'est pas devins quoi.
  • hdexhdex Membre
    13:43 modifié #10
    En plus clair ..
    Avant (qui plante sur x86 mais fonctionne sous PPC)
    -(NSString *)parseScanEngine:(NSScanner *)scanner skippinguntil:(NSString *)skippedString capturinguntil:(NSString *)getuptoString<br />{ <br />//NSLog(@&quot;Parsing %@&quot;,skippedString);<br />// Set NSScanner position<br />if (![skippedString isEqualToString:@&quot;&quot;]) [scanner scanUpToString:skippedString intoString:NULL]; <br /><br />NSString *scanresult; <br />[scanner scanUpToString:getuptoString intoString:&amp;scanresult]; <br />scanresult= [scanresult substringWithRange: NSMakeRange([skippedString length]+1,[scanresult length]-([skippedString length]+1))]; <br /><br />return scanresult<br />
    


    Après (qui plante plus sous x86 mais n'affiche pas les bonnes valeurs)
    -(NSString *)parseScanEngine:(NSScanner *)scanner skippinguntil:(NSString *)skippedString capturinguntil:(NSString *)getuptoString<br />{ <br />//NSLog(@&quot;Parsing %@&quot;,skippedString);<br />// Set NSScanner position<br />if (![skippedString isEqualToString:@&quot;&quot;]) [scanner scanUpToString:skippedString intoString:NULL]; <br /><br />NSString *scanresult; <br />[scanner scanUpToString:getuptoString intoString:&amp;scanresult]; <br /><br />NSArray *arrayOfStringComponents = [scanresult componentsSeparatedByString:@&quot;: &quot;];<br />	<br />return [arrayOfStringComponents lastObject];<br />} <br />
    

    Quand je teste sur mon MacPPC j'ai pas de soucis, mais un de mes utilisateurs Mac x86 se retrouve avec des champs ayant tous la même valeur. Après avoir fouillé un peu il semble que cela puisse venir du fait que si mon parseScanEngine retourne nil, NSDictionary s'emmêle les crayons.

    Je vais donc rajouter un test et croiser les doigts ... Si quelqu'un avec un Mac Intel et un boitier LinkSys/Sipura se sent l'âme d'un testeur, qu'il m'envoie un PM.

    Encore merci de votre aide.
  • hdexhdex Membre
    13:43 modifié #11
    Bug resolu  :)
    J'ai remplacé mon Parser maison par celui de NSXMLDocument. Un fichier html + Tidyhtml = XHTML donc on peut utiliser objectsForXquery pour recolter les infos.
    C'est un chouille plus lent mais beaucoup plus simple. Pour ceux que ça interesse encore :

    -(NSString *)retrieveInfo:(NSString *)infoToBeRetrieved inDocument:(NSXMLDocument *) xmlDocument<br />{<br />NSString *queryString = [NSString stringWithFormat:@&quot;for $info in //td where contains($info/text()[1],&#39;%@&#39;) return data($info/following-sibling::td)&quot;,infoToBeRetrieved];<br /><br />NSArray *nodes = [xmlDocument objectsForXQuery:queryString error:nil];<br />if ([nodes count] &gt; 0)<br />	{<br />	return([nodes objectAtIndex:0]);<br />	}<br />return(@&quot; &quot;);<br />}
    

Connectez-vous ou Inscrivez-vous pour répondre.