Considérons ce scénario:Android NDK: Poignée SIGSEGVs causés par un fil de Java côté
Il est une application Android qui fait des choses, ce qui pourrait être dans différents threads. Certains d'entre eux peuvent provoquer des violations de segmentation (SIGSEGV). Je veux être en mesure d'attraper toutes les violations, quel que soit le fil qui l'a causé, à partir d'un gestionnaire de signal écrit en C en utilisant NDK.
En fait, j'ai écrit un tel gestionnaire en utilisant sigaction
. Et cela fonctionne mais seulement pour le thread qui va exécuter le code NDK. Cela est dû au fait que SIGSEGVs est livré au thread qui a causé la violation, contrairement à SIGKILL qui est livré au processus. Par conséquent, mon gestionnaire ne reçoit pas SIGSEGV provoqué par d'autres threads, et le programme est tué.
Existe-t-il un moyen de rediriger tous les SIGSEGV vers mon gestionnaire? Ou, alternativement, un moyen de remplacer le gestionnaire par défaut pour TOUS les threads?
Et oui, il y a une raison pour laquelle je veux cette chose particulière dans la façon dont je l'ai décrit! ;)
Quelques informations ici: http://stackoverflow.com/questions/1083154/how-can-i-catch-sigsegv-segmentation-fault-and-get-a-stack-trace-under-jni-on/. Effectuez un appel JNI à partir de chacun de vos threads pour définir les gestionnaires de ce thread. Assurez-vous d'identifier vos plantages et chaînes spécifiques au gestionnaire précédent. – fadden
@fadden désolé, ma question n'était pas très claire! Supposons que je n'aurai pas accès aux discussions. Je ne sais pas ce qu'une application pourrait faire, je veux juste gérer tous les SIGSEGV causés par elle. – Paschalis
Ce que vous voulez est appelé handler d'exception uncaught. Il existe en Java, pas sûr de ce qu'on appelle en c/C++. – 18446744073709551615