En ce qui concerne l'enregistrement de la fosse de Flutter utilisant le socket pour signaler Terminé en raison du signal 13 dans iOS

En ce qui concerne l'enregistrement de la fosse de Flutter utilisant le socket pour signaler Terminé en raison du signal 13 dans iOS

La description

Dans le développement de flutter, socket a été utilisé, mais dans le processus de débogage, un bogue plus inexplicable a été trouvé sur le système iOS 13.

  1. Basculer l'application actuelle vers l'arrière-plan, ouvrir d'autres applications, attendre 5 à 10 minutes, puis basculer l'application actuelle au premier plan
  2. Basculer vers l'arrière-plan, puis revenir au premier plan
  3. Déverrouillez le téléphone après avoir reposé l'écran

Lorsque l'opération ci-dessus est effectuée, l'application se ferme directement (phénomène de plantage), mais contrairement au plantage habituel, le compilateur ne capturera pas les informations de plantage pertinentes lors de la liaison du compilateur au débogage, au compilateur et au téléphone mobile Le lien sera interrompu directement.

Commencez à essayer de résoudre le problème

1. Intégrez Bugly dans APPdelegate

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    
 //signal(SIGPIPE, SIG_IGN);//忽略信号
 [GeneratedPluginRegistrant registerWithRegistry:self];
 [Bugly startWithAppId:@"Bugly配置的APPID"];
 FlutterViewController *controller = (FlutterViewController*)self.window.rootViewController;
 FlutterMethodChannel *versionChannel = [FlutterMethodChannel methodChannelWithName:@"version" binaryMessenger:controller];
 return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

Après le test, il n'y a pas de journal dans le journal Bugly, donc la méthode Bugly n'est pas réalisable.

2. Test de la machine réelle

Testez les points d'arrêt dans les méthodes suivantes

// app启动或者app从后台进入前台都会调用这`在这里插入代码片`个方法
- (void)applicationDidBecomeActive:(UIApplication *)application{
    
    
}
// app从后台进入前台都会调用这个方法
- (void)applicationWillEnterForeground:(UIApplication *)application {
    
    
}
//进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application{
    
    
  
}

Une fois que le test a constaté que l'application de l'arrière-plan au premier plan, la console signale Message from debugger: Terminated due to signal 13un message d'erreur

PisteTerminated due to signal 13

Après une série d'inspections, on constate que dans le fichier signal.h, la définition est la suivante:

#define SIGPLPE 13 /* write on a pipe with no one to read it */
  1. Le pipeline est interrompu. Ce signal est généralement généré dans la communication inter-processus. Par exemple, deux processus qui utilisent la communication FIFO (canal). Si le pipeline de lecture n'est pas ouvert ou se termine de manière inattendue, écrivez dans le pipeline. Le processus d'écriture recevra le signal SIGPIPE. En outre, les deux communications utilisant Socket Processus, lorsque le processus d'écriture écrit sur le Socket, le processus de lecture est terminé. De plus, le canal sera rompu pendant l'envoi / l'écriture, et le canal sera rompu lorsque le Socket est fermé. Le signal SIGPIPE sera généralement reçu lors de l'utilisation du Socket. Il est associé à la communication par socket et à la lecture et à l'écriture de données. De cette façon, vous pouvez approximativement deviner pourquoi le crash s'est produit lors du passage au premier plan ou du déverrouillage du téléphone.
  2. L'erreur signal 13 est envoyée par le système, tout comme les exceptions d'utilisation de la mémoire et les pointeurs génériques, car il s'agit d'un plantage au niveau du système, l'exception ne peut pas être interceptée par @try, catch.
  3. Nous avons trouvé des solutions connexes dans la documentation destinée aux développeurs d'Apple ( https://developer.apple.com ).Insérez la description de l'image ici

Solution

  1. Ignorez ce type de signal.
    Avant d'appeler votre SDK, appelez le code suivant signal(SIGPIPE, SIG_IGN);
// app启动或者app从后台进入前台都会调用这个方法
 1. (void)applicationDidBecomeActive:(UIApplication *)application{
    
    
    signal(SIGPIPE, SIG_IGN);//Ignore signal
}
// app从后台进入前台都会调用这个方法
 2. (void)applicationWillEnterForeground:(UIApplication *)application {
    
    
    signal(SIGPIPE, SIG_IGN);//Ignore signal
}
  1. Modifiez le code source de la communication socket pour omettre plusieurs lignes de code ici. Bien sûr, ceux qui ont de l'expérience, il est préférable de l'essayer, après tout, c'est la meilleure façon de résoudre le problème

courir

Recompilez le projet, exécutez, testez et constatez enfin que le problème a été résolu.

Documents de référence

Auteur: haricots adultes 007
Liens: https://www.jianshu.com/p/7bef6f1c572d
Source: Jane books

Je suppose que tu aimes

Origine blog.csdn.net/gjm_123/article/details/103714034
conseillé
Classement