{"id":6426,"date":"2011-04-19T17:40:08","date_gmt":"2011-04-19T15:40:08","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6426"},"modified":"2011-04-19T17:40:08","modified_gmt":"2011-04-19T15:40:08","slug":"gdb-gnu-project-debugger-debug-del-linguaggio-assembly","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/gdb-gnu-project-debugger-debug-del-linguaggio-assembly\/","title":{"rendered":"GDB (GNU Project Debugger): Debug del linguaggio Assembly"},"content":{"rendered":"<p>Assembly? Ma il linguaggio di iOS\/Mac OS non \u00e8 l&#8217;Objective-C? Si, certo, ma a volte conviene sfruttare qualcosa che va ancora pi\u00f9 a basso livello per risolvere i nostri problemi, in questi casi parliamo dell&#8217;Assembly. In questi anni d&#8217;esperienza ho incontrato moltissimi sviluppatori, credo di averne conosciuti pi\u00f9 di 200 (sviluppatori che vantano applicazioni come Delibar, Delicious Library, BBEdit, ecc&#8230;), ma pochissimi di loro (forse li riesco a contare sulle dita di una mano) mi hanno detto di aver sfruttato appieno le potenzialit\u00e0 di GDB (GNU Project Debugger). Ecco perch\u00e8 ho deciso di scrivere questo piccolo quickstart, che non sar\u00e0 altro che un punto di partenza nel caso in cui siate interessati ad approfondire la questione, ma veniamo al dunque.<!--more--><\/p>\n<h4>Quando occorre scendere ad un livello pi\u00f9 basso?<\/h4>\n<p>Ci sono volte in cui capita di scrivere metodi (magari noiosi) e poi ci si tritrova bloccati per un problema di memoria che non riusciamo a risolvere. Spesso si tratta di errori banali, altre volte di errori un po&#8217; pi\u00f9 complessi, altre volte ancora si \u00e8 talmente sicuri del proprio codice che si arriva a pensare che sia Apple ad aver commesso un errore (mai commettere questo sbaglio :P).<\/p>\n<p>In ognuno di questi casi, saper sfruttare GDB non \u00e8 un male, anzi, ci si mette un po&#8217; di tempo a prendere confidenza, ma una volta appreso il funzionamento, non si riesce pi\u00f9 a farne a meno.<\/p>\n<p>Per questa guida sfrutteremo un piccolo esempio pratico, di cui trovate il sorgente disponibile per il download a fondo articolo. Si tratta di un banalissimo programma per iPhone che mostra in una tabella gli URL di 10 technotes presenti sul sito Apple (che consiglio di leggere, male certamente non far\u00e0 :D), prelevati da un semplicissimo array. Al tap su di una cella (row), verr\u00e0 inviato un messaggio all&#8217;applicazione di aprire Safari Mobile aprendo l&#8217;URL associato. Insomma, un programmino davvero banale e di facile comprensione.<\/p>\n<h4>Vediamo il codice del nostro programma di esempio<\/h4>\n<p>Iniziamo a vedere il codice del nostro esempio partendo dal file di intestazione (.h) del nostro RootViewController:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-01.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-01\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-01\" width=\"403\" height=\"122\" class=\"aligncenter size-full wp-image-6688\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-01.png 403w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-01-300x90.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-01-150x45.png 150w\" sizes=\"auto, (max-width: 403px) 100vw, 403px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Nel file di implementazione (.m) ho quindi istanziato l&#8217;array che contiene gli URL che andremo a mostrare e ad aprire direttamente in Safari:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-02.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-02.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-02\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-02\" width=\"550\" height=\"139\" class=\"aligncenter size-full wp-image-6689\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-02.png 821w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-02-300x75.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-02-150x37.png 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>(I pi\u00f9 attenti molto probabilmente si saranno gi\u00e0 accorti dell&#8217;errore, ma andiamo avanti ;))<\/p>\n<p>Mentre i metodi che si occuperanno di avviare Safari sono definiti nel seguente modo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-03.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-03\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-03\" width=\"550\" height=\"221\" class=\"aligncenter size-full wp-image-6690\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-03.png 915w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-03-150x59.png 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Alcuni di voi si chiederanno perch\u00e8 ho fatto tutta questa strada per aprire un semplice URL in Safari? La risposta \u00e8 complessa, cercher\u00f2 comunque di non complicare troppo le cose cercando si spegare in modo chiaro: in pratica ho bisogno di diverse iterazioni affinch\u00e8 l&#8217;errore si verifichi nel simulatore. Infatti, il simulatore, dispone di tantissima memoria (quella libera nei nostri sistemi) evidentemente molto pi\u00f9 rispetto a quella disponibile normalmente nei nostri iPhone.<\/p>\n<p>Ok, il codice del nostro piccolo esempio \u00e8 tutto qui. Facciamo partire la nostra applicazione, e noteremo che questa funzioner\u00e0 benissimo&#8230; apparentemente!<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-04.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-04\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-04\" width=\"319\" height=\"461\" class=\"aligncenter size-full wp-image-6691\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-04.png 319w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-04-207x300.png 207w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-04-103x150.png 103w\" sizes=\"auto, (max-width: 319px) 100vw, 319px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Se premiamo su una qualsiasi riga della tabella, si aprir\u00e0 Safari senza nessun problema. A questo punto non mi resta che provare a fare lo scroll e siamo a posto: metto il dito, trascino la mia tabella e magicamente&#8230; CRASH!<\/p>\n<p>A primo impatto, penso che non sia possibile, il codice \u00e8 giusto! Riavvio l&#8217;applicazione e riprovo! Risultato: stesso comportamento, quando scrollo l&#8217;applicazione questa va in crash, ma stavolta \u00e8 avvenuto in un punto diverso rispetto al precedente.. brutto segnale. Mi rimbocco le maniche e mi preparo a cercare di capire dove sta il problema.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-05.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-05.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-05\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-05\" width=\"550\" height=\"305\" class=\"aligncenter size-full wp-image-6692\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-05.png 954w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-05-300x166.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-05-150x83.png 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Come potete vedere dall&#8217;immagine qui sopra, il nostro caro GDB non da nessun errore se non un (fastidiosissimo) EXC_BAD_ACCESS.<\/p>\n<p>Siccome io so che l&#8217;array \u00e8 popolato, e lo capiamo dal fatto che i miei URL sono correttamente stampati nella tabella, provo a cercare di capire cosa non sta effettivamente funzionando e piazzo un bel breakpoint durante il runtime (subito dopo aver fatto partire l&#8217;applicazione), nella linea dove prima l&#8217;applicazione \u00e8 andata in crash, quindi riprovo ad eseguire uno scroll. Faccio uno &#8220;StepIn&#8221; cos\u00ec da entrare nel metodo:<\/p>\n<pre>\r\n-(NSString *) getFileNameForIndex:(NSInteger)index\r\n<\/pre>\n<p>Una volta al suo interno ricevo di nuovo un segnale di errore, ma questa volta si tratta di un SIGABRT:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-06.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-06.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-06\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-06\" width=\"550\" height=\"39\" class=\"aligncenter size-full wp-image-6693\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-06.png 946w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-06-300x21.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-06-150x10.png 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>A questo punto decido quindi di stampare il codice Assembly generato ed ecco il risultato:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-07.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-07.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-07\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-07\" width=\"437\" height=\"264\" class=\"aligncenter size-full wp-image-6694\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-07.png 437w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-07-300x181.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-07-150x90.png 150w\" sizes=\"auto, (max-width: 437px) 100vw, 437px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Nelle architetture ARM, le funzioni vengono gestite nel seguente modo:<\/p>\n<ul>\n<li>primi 4 parametri passati via registro (gli altri vanno nello stack e diventa pi\u00f9 complessa la gestione) con i seguenti nomi: $r0,\u00a0$r1,\u00a0$r2,\u00a0$r3<\/li>\n<li>l&#8217;indirizzo di ritorno viene passato dal registro: $lr<\/li>\n<li>il risultato viene passato nel registro: $eax<\/li>\n<\/ul>\n<p><strong>NOTA:<\/strong> ci sono delle eccezioni, piuttosto rare, ma ci sono \ud83d\ude09 ma tutto sommato, come linea guida, questa \u00e8 pi\u00f9 che sufficiente per i nostri scopi.<\/p>\n<p>Sono curioso di capire cosa ritorna la mia funziona, per logica stampando con il comando &#8216;po $eax&#8217; dovrei ottenere un oggetto stringa, invece ottengo il seguente messaggio:<\/p>\n<p><em>Can&#8217;t print the description of a NIL object.<\/em><\/p>\n<p>Che \u00e8 in linea con quanto XCode mi segnala, ovvero un errore di memoria. Continuo a curiosare ed a questo punto ho una soluzione, spezzettare la funzione:<\/p>\n<pre>\r\n-(NSString *) getFileNameForIndex:(NSInteger)index\r\n<\/pre>\n<p>in modo tale da avere pi\u00f9 pezzetti da controllare, via sicuramente pi\u00f9 semplice, ma prima, per scaramanzia, stampo il contenuto della variabile <em>dataArray<\/em>, giusto per essere sicuri che sia tutto ok:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-08.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-08.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-08\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-08\" width=\"550\" height=\"26\" class=\"aligncenter size-full wp-image-6695\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-08.png 880w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-08-300x13.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-08-150x6.png 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Come potete vedere.. non \u00e8 tutto ok&#8230; <em>dataArray<\/em> dovrebbe essere un array, mentre in realt\u00e0, in questo caso, \u00e8 un <em>NSBundle<\/em> con retainCount uguale a 4:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-09.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-09.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-09\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-09\" width=\"466\" height=\"29\" class=\"aligncenter size-full wp-image-6696\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-09.png 466w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-09-300x18.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-09-150x9.png 150w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>A questo punto \u00e8 chiaro che il problema \u00e8 proprio con la variabile <em>dataArray<\/em>, aggiungo un breakpoint quando creo il <em>dataArray<\/em> e faccio ripartire l&#8217;applicazione.<\/p>\n<p>Mi fermo subito dopo l&#8217;init dell&#8217;array e so gi\u00e0 che, visto il funzionamento iniziale della app, il suo contenuto fino a questo punto \u00e8 corretto, ma deve esserci qualcosa che rilascia l&#8217;array, decido di stampare lo stack di autorelease:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-10.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-10\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-10\" width=\"396\" height=\"178\" class=\"aligncenter size-full wp-image-6697\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-10.png 396w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-10-300x134.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-10-150x67.png 150w\" sizes=\"auto, (max-width: 396px) 100vw, 396px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Noto che al top dello stack (cio\u00e8 appena uscir\u00f2 dalla funzione, &#8216;viewDidLoad&#8217; sar\u00e0 rilasciato) c&#8217;\u00e8 un NSArrayI, per curiosit\u00e0 stampo il suo contenuto:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-11.png\" alt=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-11\" title=\"GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-11\" width=\"494\" height=\"174\" class=\"aligncenter size-full wp-image-6698\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-11.png 494w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-11-300x105.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-11-150x52.png 150w\" sizes=\"auto, (max-width: 494px) 100vw, 494px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>ED ECCO IL NOSTRO ARRAY! E l&#8217;errore \u00e8 veramente banale:\u00a0&#8216;NSArray arrayWithObjects:&#8217; crea un array autorelease che verr\u00e0 rilasciato appena il pool sar\u00e0 &#8220;drainato&#8221;, cio\u00e8 all&#8217;uscita della funzione.<\/p>\n<p>L&#8217;applicazione funziona correttamente subito dopo il lancio, perch\u00e8 i registri non vengono puliti immediatamente e nel simulatore, con memoria di 2, 4, 6, 8 o pi\u00f9 giga, non \u00e8 sempre necessaria questa procedura, ecco perch\u00e8 spesso ci sono problemi che sorgono solo sui device e non nei simulatori. Ecco quindi che il problema si verifica solo in seconda istanza.<\/p>\n<p>Sostituisco il metodo con [[NSArray alloc] init&#8230;] e tutto funziona a meraviglia!<\/p>\n<p>Se volete approfondire l&#8217;argomento, vi consiglio di leggere la nota tecnica\u00a0<a title=\"TN2239\" href=\"http:\/\/developer.apple.com\/library\/ios\/#technotes\/tn2239\/_index.html\" target=\"_blank\">TN2239 sul sito della Apple<\/a>, mentre se avete gi\u00e0 qualche base di GDB, allora una bella\u00a0<a title=\"GDB Reference Card\" href=\"http:\/\/bonto.ch\/public\/gdb-refcard.pdf\" target=\"_blank\">Reference Card per GDB<\/a> sicuramente non guasta. \ud83d\ude09<\/p>\n<p>Eccovi il sorgente del progetto di esempio utilizzato nella nostra guida: <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/GDB-GNU-Project-Debugger-Debug-del-linguaggio-Assembly-AssemblyTest.zip\" taerget>AssemblyTest<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Assembly? Ma il linguaggio di iOS\/Mac OS non \u00e8 l&#8217;Objective-C? Si, certo, ma a volte conviene sfruttare&#8230;<\/p>\n","protected":false},"author":540,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[8],"tags":[710,711,708,331,709,712],"class_list":["post-6426","post","type-post","status-publish","format-standard","hentry","category-guide-varie","tag-debug-applicazioni-iphone","tag-exc_bad_access","tag-gdb","tag-gestione-memoria-iphone","tag-gnu-project-debugger","tag-sigabrt"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6426","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/540"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6426"}],"version-history":[{"count":5,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6426\/revisions"}],"predecessor-version":[{"id":6701,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6426\/revisions\/6701"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6426"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6426"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}