Android natives malloc() erlaubt Zuweisungen über RAM hinaus, aber der Prozess wird während des Memset abgebrochen; KeinAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Android natives malloc() erlaubt Zuweisungen über RAM hinaus, aber der Prozess wird während des Memset abgebrochen; Kein

Post by Anonymous »

Ich arbeite an einer Android-Anwendung, die nativen C/C++-Code verwendet und mit malloc() große Speicherzuweisungen durchführt.
Auf einem 8-GB-Android-Gerät (Android 14+) ordne ich wiederholt große Speicherblöcke (ungefähr 1 GB pro Zuweisung) mit malloc() zu.
Was ich beobachte, ist:
  • Code: Select all

    malloc()
    gibt für jede Zuweisung einen Zeiger ungleich Null zurück
  • Wenn ich den zugewiesenen Speicher nicht initialisiere oder darauf zugreife, wird die Anwendung weiter ausgeführt
  • In diesem Fall kann die zugeteilte Gesamtgröße die physische RAM-Größe des Geräts überschreiten
  • Wenn ich den Speicher mit memset() initialisiere, wird die Anwendung nach einigen Iterationen beendet
  • Der Fehler tritt während memset() auf, nicht beim malloc()-Aufruf
  • Es gibt:

    Kein malloc()-Fehler
  • Keine NULL-Rückgabe
[*]Der Prozess wird abrupt beendet


Nach der Beendigung zeigt Logcat Meldungen an wie:

Code: Select all

InputDispatcher: channel 'com.example.app/.MainActivity'
~ Channel is unrecoverably broken and will be disposed
Zusätzliche Details:
  • Der von malloc() zurückgegebene Zeiger erscheint gültig, bis memset() ausgeführt wird
  • Die Anzahl erfolgreicher Zuweisungen variiert, aber nach einigen großen Zuweisungen tritt beim Zugriff auf den Speicher regelmäßig ein Fehler auf.
  • Die App definiert eine Anwendungsunterklasse -- Weder onLowMemory() noch onTrimMemory() wird aufgerufen, bevor der Prozess beendet wird
Ich versuche zu verstehen:
  • Warum erlaubt malloc() die Zuweisung von Speicher über den physischen RAM hinaus, wenn nicht darauf zugegriffen wird?
  • Warum der Prozess wird während memset() beendet, anstatt dass malloc() nullptr?
zurückgibt

Code: Select all

#include 
#include 
#include 

#define ONE_GB (1024ULL * 1024 * 1024)

void allocate_chunks(int iterations) {
for (int i = 0; i < iterations; i++) {
void* ptr = malloc(ONE_GB);
__android_log_print(ANDROID_LOG_INFO, "NATIVE",
"Iteration %d, ptr=%p", i, ptr);

if (!ptr) {
__android_log_print(ANDROID_LOG_ERROR, "NATIVE",
"malloc returned NULL");
return;
}

// Uncommenting the following line causes the app to be killed
memset(ptr, 0, ONE_GB);
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post