Italian L'applicazione si è bloccata in modo anomalo

StefanoTag

Active Member
Licensed User
Longtime User
Salve a tutti!
Chiedo un piccolo aiuto per risolvere un'anomalia di cui non capisco l'origine.
Improvvisamente,senza nulla aver modificato nell'IDE di sviluppo (almeno questo è quello che credo...), quando finisco di compilare un'applicazione e magari si verifica un errore, anche banale, durante l'esecuzione, non ricevo più il messaggio di errore con le indicazioni del tipo di errore che si è verificato, ma invece l'App si interrompe bruscamente e ricevo semplicemente il messaggio che l'applicazione si è bloccata in modo anomalo.
Da cosa dipende? Cosa devo fare per ripristinare la modalità precedente per poter leggere qualche indicazione sul codice che ha provocato quell'interruzione?
Ringrazio chiunque vorrà darmi qualche suggerimento...
 

StefanoTag

Active Member
Licensed User
Longtime User
Ti ringrazio per l'aiuto, ma continua a non funzionarmi...sia in modalità debug, che in modalità release (nella quale ero solitamente abituato a lavorare) appena si verifica un qualsiasi errore di funzionamento, l'App si chiude indicandomi semplicemente che il programma 'pippo' è stato arrestato senza nessun'altra informazione...???...
 

Star-Dust

Expert
Licensed User
Longtime User
Intercetta l'errore nel servizio Starter

B4X:
Sub Process_Globals
    Private logs As StringBuilder
    Private logcat As LogCat
    Private const emailAddress As String = "pippo@youremail.org"

Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    'wait for 500ms to allow the logs to be updated.
    Dim jo As JavaObject
    Dim l As Long = 500
    jo.InitializeStatic("java.lang.Thread").RunMethod("sleep", Array(l))
    logcat.LogCatStop
    logs.Append(StackTrace).Append(CRLF).Append(Error)
    Dim email As Email
    email.To.Add(emailAddress)
    email.Subject = "Pippo - crashed"
    email.Body = logs
    StartActivity(email.GetIntent)
    'ToastMessageShow("APP CRASHED" & CRLF & " send email to developer",FALSE)
    Return True
End Sub
 
Last edited:

StefanoTag

Active Member
Licensed User
Longtime User
Grazie Star-Dust del tuo suggerimento...faccio un pò di fatica a comprenderlo (sono un "novizio") ma ci proverò di sicuro.
Per LucaMs: compilo direttamente sul mio cellulare connesso all'IDE con WiFi.

Il mio disappunto è che tutto è accaduto da un momento all'altro senza che io nulla avessi fatto (...forse non è così :rolleyes:) però adesso scrivere codice, specialmente per me, è diventata cosa ardua perchè quando si riceve il messaggio che l'App è bloccata senza altre indicazioni, diventa davvero un problema capire in quale punto del programma poter intervenire per fare correzioni....
 

Star-Dust

Expert
Licensed User
Longtime User
Non so quale versione di B4A hai. Ma quando apri un nuovo progetto ti crea in automatico il servizio Starter. E' un servizio che inizia ancor prima dell'Avvio dell'Activity e permette anche di intercettare errori in qualunque punto dell'App.

Dovresti trovarti fra le finestre oltre all'activity anche Starter. (se non c'é puoi creare un servizio con questo nome)
All'interno inserisci quel codice che ti ho postato.
 

StefanoTag

Active Member
Licensed User
Longtime User
Grazie Star-Dust! Ora mi è tutto un pò più chiaro...lo proverò appena esco da scuola! Grazie ancora...
 

udg

Expert
Licensed User
Longtime User
Se il tuo set-up è costituito da una connessione wi-fi tra device e pc di sviluppo (ovunque viene consigliata la connessone USB, ma anche io per praticità preferisco la wi-fi soprattutto per veloci test), ricorda di mettere tra i Project Attributes
B4X:
#BridgeLogger: True
In questo modo dovresti poter visualizzare i messaggi di log anche se compili in Release mode invece che Debug.

@Star-Dust : ottimo il tuo post, un like non basta! Ma perchè hai tolto la tua vera mail? Non penserai mica che ne avremmo approfittato per inviarti centinaia di fake mail? eheh
 

Star-Dust

Expert
Licensed User
Longtime User
Se il tuo set-up è costituito da una connessione wi-fi tra device e pc di sviluppo (ovunque viene consigliata la connessone USB, ma anche io per praticità preferisco la wi-fi soprattutto per veloci test), ricorda di mettere tra i Project Attributes
B4X:
#BridgeLogger: True
In questo modo dovresti poter visualizzare i messaggi di log anche se compili in Release mode invece che Debug.

@Star-Dust : ottimo il tuo post, un like non basta! Ma perchè hai tolto la tua vera mail? Non penserai mica che ne avremmo approfittato per inviarti centinaia di fake mail? eheh
E' l'email dell'account google, che sulla scheda Google delle mie App é pubblica. L'ho tolta semplicemente per dare l'indicazione di mettere la sua email, non vorrei ricevere le segnalazioni dei suoi crash :p

P.S. #BridgeLogger: True solo se hai B4A 6.8+ ;);)
Io ho 6.5 e non ho questo attributo, mi manca l'attributo praticamente :confused::confused::confused:
 

udg

Expert
Licensed User
Longtime User
P.S. #BridgeLogger: True solo se hai B4A 6.8+
Ah, ecco perchè non l'ho mai utilizzato..eheh
Lo consigliavo perchè mi sa che, non avendo cambiato il suo programma, magari aveva aggiornato B4A e B4A-Bridge.

Io ho 6.5 e non ho questo attributo, mi manca l'attributo praticamente
Seee 6.5, dì pure 65..eheh
 

StefanoTag

Active Member
Licensed User
Longtime User
Ringrazio tutti coloro che mi hanno dedicato la loro attenzione.
Io sto usando B4A 6.8 e compilo in modalità 'release' connesso WiFi al device.
Purtroppo ho seguito tutti i vostri suggerimenti ma non riesco ancora a costringere il sistema, quando va in crash a mostrarmi, quei bellissimi messaggi neri di errore che, con un pò di fatica da parte mia, però mi indicavano l'equivoco, l'evento, la dimenticanza o il punto esatto che avevano provocato quell'interruzione. Adesso compare solo un anonimo e odiosissimo avvertimento che "Il programma Pippo è stato arrestato" e con questo mi devo arrangiare...
Nonostante aver provato, da bravo scolaretto quale mi sento, tutte le vostre indicazioni la situazione non si è mossa. Sono cereto che la soluzione sta dietro l'angolo, ma non so dove sia quell'angolo.

p.s. ...per Star Durst: è vero! Sono entrato a scuola a 6 anni e ora che ne ho 65 ci sono ancora. Peggio di un ergastolo...di un "piacevolissimo" ergastolo :)
 

StefanoTag

Active Member
Licensed User
Longtime User
...che dipenda dal fatto che l'App è diventata circa 2 MB??!?
Forse è troppo grossa??!?
 

Star-Dust

Expert
Licensed User
Longtime User
Puoi portare il codice?
Cosa fa questa.App, dacci qualche indicazione
...che dipenda dal fatto che l'App è diventata circa 2 MB??!?
Forse è troppo grossa??!?
 

StefanoTag

Active Member
Licensed User
Longtime User
Per avere la certezza che l'inconveniente non dipende dal codice di per sè, ho appena provato ad inserire un errore banale come prima riga dell'Activity_Create:

Msgbox2("Testo qualunque" , "Titolo", "", "","OK" ,LoadBitmap (File.DirAssets, "pippo.png"))

Il tutto senza volutamente inserire l'immagine png, per cui, non trovando pippo.png, l'App va in crash e mi dà il solito ermetico messaggio che il programma si è interrotto. Nè dipende dal device perchè lo fa sia sul mio cell che in un altro paio di Tablet di marca diversa.
Temo sinceramente che dipenda dal fatto che il modulo Starter l'ho copiato pari pari dall'esempio di Erel di un tutorial sulla connessione WiFi tra due devices poichè ho necessità di provare uno scambio di dati tra client e server. E la cosa funziona bene, senza problemi. L'unico enorme inconveniente è che se si verifica un errore (di qualunque tipo! come quello banale descritto all'inizio) non ricevo più alcuna indicazione sul tipo di errore che ha interrotto l'App. Questo anche se ho messo nel modulo Starter le indicazioni di Star Dust. ...boh!!!!
 

Star-Dust

Expert
Licensed User
Longtime User
Ci sarà qualche altro errore nel codice.

Manda almeno il codice della classe starter. Tutto completo...
 

StefanoTag

Active Member
Licensed User
Longtime User
Il modulo service Starter è questo:

B4X:
#Region  Service Attributes
    #StartAtBoot: False
    #ExcludeFromLibrary: True
#End Region

Sub Process_Globals
    Public connected As Boolean
    Private client As Socket
    Public server As ServerSocket
    Private astream As AsyncStreams
    Private const PORT As Int = 51042
    '-------------------------------------------
    Private logs As StringBuilder
    Private logcat As LogCat
    Private const emailAddress As String = "alfatau@infol.it"
End Sub

Sub Service_Create
    server.Initialize(PORT, "server")
    server.Listen
End Sub

Sub Server_NewConnection (Successful As Boolean, NewSocket As Socket)
    If Successful Then
        CloseExistingConnection
        client = NewSocket
        astream.InitializePrefix(client.InputStream, False, client.OutputStream, "astream")
        UpdateState(True)
    End If
    server.Listen
End Sub

Sub Service_Start (StartingIntent As Intent)

End Sub

Public Sub ConnectToServer(Host As String)
    Log("Trying to connect to: " & Host)
    CloseExistingConnection
    Dim client As Socket
    client.Initialize("client")
    client.Connect(Host, PORT, 10000)
End Sub

Public Sub Disconnect
    CloseExistingConnection
End Sub

Sub Client_Connected (Successful As Boolean)
    If Successful Then
        astream.InitializePrefix(client.InputStream, False, client.OutputStream, "astream")
        UpdateState (True)
        '''ToastMessageShow("CONNESSIONE ATTIVA!",True)
        Return True
    Else
        ToastMessageShow("ASSENZA DI CONNESSIONE!",True)
        Return False
    End If
End Sub

Sub CloseExistingConnection
    If astream.IsInitialized Then astream.Close
    If client.IsInitialized Then client.Close
    UpdateState (False)
End Sub

Sub UpdateState (NewState As Boolean)
    connected = NewState
    CallSub(Main, "SetState")
End Sub

Sub AStream_Error
    UpdateState(False)
End Sub

Sub AStream_Terminated
    UpdateState(False)
End Sub

Sub AStream_NewData (Buffer() As Byte)
    CallSub2(Main, "RX_Dati", Buffer)
End Sub

Public Sub SendData (data() As Byte)
    If connected Then
        astream.Write(data)
    Else
        ToastMessageShow("LA TRASMISSIONE DEL DATO NON E' AVVENUTA!",False)
    End If
End Sub


'Return true to allow the OS default exceptions handler to handle the uncaught exception.
Sub Application_Error1 (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub Service_Destroy

End Sub

Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    'wait for 500ms to allow the logs to be updated.
    Dim jo As JavaObject
    Dim l As Long = 500
    jo.InitializeStatic("java.lang.Thread").RunMethod("sleep", Array(l))
    logcat.LogCatStop
    logs.Append(StackTrace).Append(CRLF).Append(Error)
    Dim email As Email
    email.To.Add(emailAddress)
    email.Subject = "Pippo - crashed"
    email.Body = logs
    StartActivity(email.GetIntent)
    ToastMessageShow("APP CRASHED" & CRLF & " send email to developer",False)
    '''Return True
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Scusate se non sarò utilissimo; per motivi vari non ho letto tutti i post.

Per quanto ne so (poco, dato che non lo uso) se si utilizza il bridge (quindi non si connette il dispositivo tramite cavetto USB ma usando il WiFi), non si ottengono i log se si compila in release mode.

Un altro possibile problema può essere l'impostazione dei log sul dispositivo.
 

Star-Dust

Expert
Licensed User
Longtime User
Scusate se non sarò utilissimo; per motivi vari non ho letto tutti i post.

Per quanto ne so (poco, dato che non lo uso) se si utilizza il bridge (quindi non si connette il dispositivo tramite cavetto USB ma usando il WiFi), non si ottengono i log se si compila in release mode.

Un altro possibile problema può essere l'impostazione dei log sul dispositivo.
@udg ha suggerito di inserire l'attributo #BridgeLogger: True cosi da aver ei log in Wifi anche in realease.
 
Top