Frage

Unter der Annahme der neuesten XCode und GCC, was ist der richtige Weg, um die Speicherzuordnungsfunktionen außer Kraft zu setzen (ich schätze Operator neu / löschen als auch). Der Debug-Speicher Verteilern ist zu langsam für ein Spiel, ich nur einige grundlegenden Statistiken muß ich mich mit minimalen Auswirkungen tun kann.

ich weiß, ist es einfach in Linux aufgrund des Haken, und das war trivial unter Codewarrior vor zehn Jahren, als ich HeapManager geschrieben.

Leider SmartHeap nicht mehr hat eine Mac-Version.

Keine korrekte Lösung

Andere Tipps

würde ich Bibliothek Vorbelastung für diese Aufgabe verwenden, da es keine Änderung des laufenden Programms erfordern. Wenn Sie mit der üblichen Unix Weise vertraut sind, dies zu tun, es ist fast eine Frage der Ersetzung LD_PRELOAD mit DYLD_INSERT_LIBRARIES.

Der erste Schritt ist es, eine Bibliothek mit Code wie diese zu erstellen, dann bauen sie regelmäßig gemeinsam genutzte Bibliothek Verknüpfungsoptionen mit (gcc -dynamiclib):

void *malloc(size_t size)
{
    void * (*real_malloc)(size_t);
    real_malloc = dlsym(RTLD_NEXT, "malloc");

    fprintf(stderr, "allocating %lu bytes\n", (unsigned long)size);
    /* Do your stuff here */

    return real_malloc(size);
}

Beachten Sie, dass, wenn Sie auch calloc() ablenken und deren Umsetzung ruft malloc(), können Sie zusätzlichen Code müssen überprüfen, wie Sie genannt werden wird. C ++ Programme sollten ziemlich sicher sein, weil der new Operator ruft malloc() sowieso, aber beachten Sie, dass kein Standard, erzwingt. Ich habe noch nie eine Implementierung erkannt, die nicht malloc() verwendet haben, though.

Schließlich legen Sie die Ablaufumgebung für Ihr Programm und starten Sie es (möglicherweise Anpassungen erfordern, je nachdem wie der Shell behandelt Umgebungsvariablen):

export DYLD_INSERT_LIBRARIES=./yourlibrary.dylib
export DYLD_FORCE_FLAT_NAMESPACE=1
yourprogram --yourargs

der dyld Manpage für weitere Informationen zu dem dynamischen Linker Umgebungsvariablen.

Diese Methode ist ziemlich allgemein. Es gibt jedoch Einschränkungen:

      
  • Sie werden nicht direkt System Anrufe umleiten der Lage sein,   
  • Wenn die Anwendung selbst Tricks, die Sie von dlsym() mit malloc Adresse zu laden, wird der Anruf nicht umgeleitet werden. Es sei denn, jedoch betrügen Sie es, indem auch Umleitung dlsym zurück!

Die malloc_default_zone Technik erwähnt unter http: // Listen. apple.com/archives/darwin-dev/2005/Apr/msg00050.html scheint immer noch zu funktionieren, siehe zB http: // Code. google.com/p/fileview/source/browse/trunk/fileview/fv_zone.cpp?spec=svn354&r=354 für ein Beispiel verwenden, die ähnlich zu sein scheint, was Sie möchten.

Nach langer Suche (dabei) und Ausgaben mit 10,7 habe ich beschlossen, eine Blog-Post über dieses Thema zu schreiben: Wie setzen malloc Haken in OSX Lion

Sie werden ein paar guten Links am Ende des Pfostens mit mehr Informationen zu diesem Thema finden.

Die Basislösung:

malloc_zone_t *dz=malloc_default_zone();
if(dz->version>=8)
{
    vm_protect(mach_task_self(), (uintptr_t)malloc_zones, protect_size, 0, VM_PROT_READ | VM_PROT_WRITE);//remove the write protection
}
original_free=dz->free;
dz->free=&my_free; //this line is throwing a bad ptr exception without calling vm_protect first
if(dz->version==8)
{
    vm_protect(mach_task_self(), (uintptr_t)malloc_zones, protect_size, 0, VM_PROT_READ);//put the write protection back
}

Dies ist eine alte Frage, aber ich kam über sie bei dem Versuch, dies selbst zu tun. Ich wurde neugierig zu diesem Thema für ein persönliches Projekt, das ich an arbeite, vor allem, um sicherzustellen, dass das, was ich dachte, automatisch freigegeben richtig aufgehoben wurde. Ich landete eine C ++ Implementierung zu schreiben, mir zu erlauben, die Menge von zugeordneten Haufen zu verfolgen und darüber berichten, wenn ich so entschieden habe.

https://gist.github.com/monitorjbl/3dc6d62cf5514892d5ab22a59ff34861

Wie der Name schon Notizen, ist dies OSX spezifisch. Allerdings konnte ich dies auf Linux-Umgebungen tun mit dem malloc_usable_size

Beispiel:

#define MALLOC_DEBUG_OUTPUT
#include "malloc_override_osx.hpp"

int main(){
   int* ip = (int*)malloc(sizeof(int));
   double* dp = (double*)malloc(sizeof(double));

   free(ip);
   free(dp);
}

Gebäude

$ clang++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk \
          -pipe -stdlib=libc++ -std=gnu++11 -g -o test test.cpp
$ ./test
0x7fa28a403230 -> malloc(16) -> 16
0x7fa28a403240 -> malloc(16) -> 32
0x7fa28a403230 -> free(16) -> 16
0x7fa28a403240 -> free(16) -> 0

Hope dies hilft jemand anderes heraus in der Zukunft!

Wenn die grundlegenden Statistiken, die Sie benötigen, kann in einem einfachen Wrapper gesammelt werden, ein schneller (und ein bisschen schmutzig) Trick nur verwenden einig #define Makro ersetzt werden.

void* _mymalloc(size_t size)
{
    void* ptr = malloc(size);

    /* do your stat work? */

    return ptr;
}

und

#define malloc(sz_) _mymalloc(sz_)

Hinweis : Wenn das Makro definiert ist vor die _mymalloc Definition es innerhalb dieser Funktion wird am Ende des malloc Anruf ersetzen Sie mit Endlosschleife zu verlassen ... so sicherzustellen, dass dies ist nicht der Fall. Vielleicht möchten Sie es ausdrücklich vor dieser Funktionsdefinition #undef und einfach (re) definieren sie danach je nachdem, wo Sie es einschließlich am Ende hoffentlich diese Situation zu vermeiden.

Ich denke, wenn man eine malloc () und free () in Ihrer eigenen C-Datei, die in dem Projekt der Linker diese Version werden lösen definieren.

Nun, wie wollen Sie malloc implementieren?

Überprüfen Sie heraus Emery Berger - der Autor des Hortes des Speicherzuordner - Ansatz bei der allocator auf OSX für das Ersetzen

scroll top