2016-05-27 6 views
0

In meiner iOS-Anwendung bekomme ich einen EXC_BAD_ACCESS Absturz auf einer der globalen Variablen, die ich in meinem C/C++ Code verwende, wenn die App beendet wird. Bitte beachten Sie, dass die App nicht im Hintergrund angezeigt wird, sondern beim Schließen der App beendet wird, indem Sie angeben, dass sie nicht in der Datei info plist im Hintergrund ausgeführt werden soll.iOS App stürzt bei App-Beendigung mit EXC_BAD_ACCESS auf globalen/statischen Variablen ab

Es folgt die zugehörige Code ..

#include "chromium/threading/thread_local.h" 
#include "libev/ev.c" 

namespace simplegetter { 


ThreadLocalPointer<ev_io> threadLocal_sock_watcher; 
ThreadLocalPointer<ev_timer> threadLocal_timer; 


void start_get (my_get_struct* get_struct) { 

    ev_io* sock = new ev_io; 
    ev_timer* temp_timer = new ev_timer; 

    threadLocal_sock_watcher.Set(sock); 
    threadLocal_timer.Set(temp_timer); 

    //... other code.. 

} 

void fire_again(my_get_struct* get_struct, uint32_t rtt) { 
    double repeat = get_client_repeat_value(rtt); 
    if (repeat < 0.5) repeat = 0.5; 
    threadLocal_timer.Get()->repeat = repeat; 
    get_struct->prev_timeout_finish_time = CURRENT_TIME_MS; 
    ev_timer_again(threadLocalLoop.Get(), threadLocal_timer.Get()); 

    //.. other code 
} 

//... other code 

}; 

threadLocal_timer ist die globale Variable ich spreche. Die Methode start_get wird für einen neuen Thread zum Abrufen einer Netzwerkressource aufgerufen. Die Methode fire_again wird mehrmals im Thread aufgerufen, der die Methode start_get aufgerufen hat, bis der Vorgang abgeschlossen ist.

Jetzt ist das Problem, bei der App-Beendigung (dh wenn iOS einen Exit() -Aufruf auf dem Hauptthread .. (das ist, weil die App nicht in den Status suspendiert oder im Hintergrund ausgeführt werden soll), scheint iOS die globale Variable dh threadLocal_timer in diesem Fall der Freigabe aus, die EXC_BAD_ACCESS in meinem Code in Zeile zu einem Absturz führt:

threadLocal_timer.Get()->repeat = repeat; 

So ist die globale Variable vom iOS freigegeben bevor der Thread gestoppt wird Nach der Beendigung der App Meine Frage ist, gibt es eine Lösung, wie ich mit diesem Absturz umgehen kann, abgesehen von der Verwendung von statischen oder globalen v überhaupt im obigen Code?

+0

Welche Bibliothek, welche Variablen? Entschuldigung, wir sind keine Hellseher. – SergeyA

+0

@SergeyA Diese C/C++ - Bibliothek ist eine interne Bibliothek, die einige statische und globale Variablen im Code enthält. ex: ev_timer ist eine solche globale Variable, auf der ein EXC_BAD_ACCESS abstürzt – Ravi

+0

Nein, es ist nicht klar. Wir haben keine Ahnung, was in Ihrer Bibliothek passiert. – SergeyA

Antwort

0

Ihre Frage ist zu vage.

Ich habe Apps geschrieben, die lange laufende Hintergrundprozesse haben, die von globalen Ressourcen abhängig sind, ganz wie du es beschreibst.

Was ich getan habe, war eine globale Hintergrundaufgabe zu zählen. Jedes Mal, wenn ich eine dieser lang laufenden Aufgaben gestartet habe, habe ich eine Funktion für den Hauptthread aufgerufen, der die Anzahl der Aufgaben erhöht hat.

Ganz am Ende des Shutdown-Code für die lang andauernden Aufgaben, nenne ich eine andere Funktion (auf dem Haupt-Thread), daß den Zähler dekrementiert.)

In dem Code, der die Fadenzahl dekrementiert, wenn das count hits zero, ich trenne meine globalen Ressourcen aus und nulle sie aus.

Mit dieser Logik werden die globalen Ressourcen nicht freigegeben, bis der letzte Hintergrundthread mit ihnen ausgeführt wird.

Ein solcher Ansatz würde wahrscheinlich für Ihr Problem funktionieren, aber ich kann nicht genauer sein, ohne mehr darüber zu wissen.

+0

Ich habe meine Frage bearbeitet und relevanten Code veröffentlicht. Mein Problem ist, dass iOS die globalen Variablen, die ich benutzt habe, freigibt, bevor ich einen Thread stoppe, der diese Variablen verwendet. Bitte lassen Sie mich wissen, wenn ich noch unklar bin. Danke für die Mühe zu antworten. – Ravi