2015-05-29 13 views
8

Ich bin ein Android-Programmierer.FORTIFY_SOURCE: FD_SET: Dateibeschreibung> = FD_SETSIZE. Calling abort()

Heute habe ich eine Android-Anwendung, die Zeit habe ich diese Art von Fehler.

FORTIFY_SOURCE: FD_SET: Dateibeschreibung> = FD_SETSIZE. Aufruf abbrechen().

also bitte wenn jemand diese Antwort für dieses Problem wissen, bitte antworte mir.

+1

Und wie können wir den Fehler ohne Code überprüfen? – BabyDuck

+1

Übrigens, wenn Sie auf dieses Problem stoßen, kann es mithilfe der Google Play Services ProviderInstaller-API behoben werden. Weitere Informationen zur Verwendung finden Sie in diesem Artikel: https://developer.android.com/training/articles/security-gms-provider.html – kroot

Antwort

13

In Ihrem Prozess sind zu viele Dateideskriptoren oder Sockets geöffnet, und wenn das Betriebssystemlimit erreicht ist, wird Ihre App gelöscht.

Es ist sehr unwahrscheinlich, dass Ihre App legitim alle Ressourcen verbraucht, es ist wahrscheinlich ein Leck. Vermutlich verpassen Sie einen Close() -Aufruf für einen Socket oder eine Dateiressource.

Ich habe dieses Problem auf verschiedenen Android-Geräten mit dem gleichen Code. Die häufigste Fehlersignatur war:

01-27 15:50:52.431 I/DEBUG ( 172): pid: 12444, tid: 19014, oom: 0, name: DrmRequestHandl >>> YOUR_PACKAGE_NAME <<< 
01-27 15:50:52.431 I/DEBUG ( 172): signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 
01-27 15:50:52.517 I/DEBUG ( 172): Abort message: 'FORTIFY_SOURCE: FD_SET: file descriptor >= FD_SETSIZE. Calling abort().' 

Sie können die Beschreiber Grenze auf Ihrem Gerät calling überprüfen:

adb shell ulimit -n 

Als ersten Schritt, das Problem zu lösen, müssen Sie möglicherweise, um herauszufinden, welche Art von Ressourcen sind undicht. Sie können den Prozess-ID der App heraus von:

adb shell ps 

Dann den Prozess-ID verwenden, während der App noch laufen, können Sie für die offenen Deskriptoren überprüfen (Sie Root-Zugriff benötigen):

adb shell ls -l /proc/[YOUR_PROCESS_ID]/fd 

Für die 12345-Prozess es so etwas wie wäre:

adb shell ls -l /proc/12345/fd 

Diese Deskriptoren listet. Bei älteren Android-Versionen können Sie 1024 Elemente in der Liste haben, bei Lollipop habe ich 2048 als Standardlimit gesehen.

+3

Sie benötigen keinen Root-Zugriff, um die Dateideskriptoren zu sehen: 'adb shell run-as $ IhreApplicationId ls -l/proc/$ yourProcessId/fd/'. ZB, adb shell run-as com.meinefirma.meineanwendung ls -l/proc/12345/fd' – Joe

+2

Ich habe ein einfaches Shell-Skript geschrieben (getestet auf macOS), um die Anzahl der geöffneten Dateideskriptoren für eine Android-App zu überwachen: https://gist.github.com/jansche/322965fa3c3a6179114bc3ac8e4337ec – Joe