2016-01-08 10 views
10

Ich versuche, Speicherzugriffe auf Heap allozierten Speicher aufzuspüren.Speicherzugriffsmonitor für c-Programme

Zum Beispiel, wenn ich den folgenden Code haben:

void set_value(int* buffer, size_t pos, int value) { 
    buffer[pos] = value; 
} 
int main(void) {  
    int* buffer = malloc(BUFF_SIZE * sizeof(int)); 
    set_value(buffer, 2, 10); 
    set_value(buffer, 3, 12); 

    free(buffer); 
    return 0; 
} 

Ich bin in erster Linie daran interessiert, die Funktionen, die den Speicher und die Adresse des Inhalts zuzugreifen, die geändert wurden. mehrere Memory-Tools wie ptrace, verwenden Strace,

Ich habe versucht, Asan, dmalloc, aber ich habe das Ergebnis nicht erreichen.

Eine andere Idee war es, den Speicher zu ändern ändern Sie den Schutz des Speichers mit mprotect und Schreiben der Handler für Page Faults. Ich habe den Speicher schreibgeschützt, und wenn ein Schreibvorgang stattfindet, ändert der Handler den Seitenschutz und lässt die Funktion den Inhalt in den Speicher schreiben, aber danach kann ich die Seite nicht noch einmal für weitere Zugriffe lesen.

Haben Sie Tipps, wie Sie jeden auf den Heapspeicher geschriebenen Schreibvorgang überwachen können?

+1

Mit 'gdb' können Sie einen Hardware-Haltepunkt für die Adresse festlegen. GDB nennt sie * watchpoint * s.Soweit ich weiß, haben Sie auf der x86-Plattform ein Limit von 4 Watchpoints, aber das könnte ein Implementierungsdetail gewesen sein? Ich bin mir da nicht 100% ig sicher. Siehe https://sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html – inetknght

+0

Haben Sie erwogen, 'memcmp()' zu verwenden? Für die Blöcke, die Sie überwachen möchten, können Sie eine _copy_ speichern und dann regelmäßig überprüfen, ob der gewünschte Speicherpfad mit der Kopie übereinstimmt. 'memcmp (copy, location, len_location);' – ryyker

+0

Bitte geben Sie etwas mehr Details an. Interessieren Sie sich für Laufzeitbenachrichtigungen von _within_ Ihrer Anwendung oder mithilfe eines externen Tools oder ist die in den Kommentaren erwähnte Debug-Methode ausreichend? _ [DMalloc] (http://dmalloc.com/docs/latest/online/dmalloc_7.html) _ veröffentlicht Funktionen, die perfekt Ihren Anforderungen entsprechen. Was genau hat mit DMalloc nicht funktioniert? – ryyker

Antwort

1

Wenn Sie bereit sind, jeden Speicherzugriff zu überwachen, würde ich vorschlagen, die Pakete wie PIN [1] und/oder DynInst [2] zu sehen. Bei beiden handelt es sich um dynamische binäre Instrumentierungspakete, mit denen Sie eine Anwendungsbinärdatei so ändern können, dass der gewünschte Code injiziert wird. In diesem Fall können Sie mit beiden Tools jede einzelne Anweisung instrumentieren und die Adresse kennen, auf die sie verweisen (wenn sie geladen/gespeichert werden). Wenn Sie nur an von malloc (oder realloc oder calloc) zugewiesenem Speicher interessiert sind, können Sie diese Routinen auch instrumentieren, um ihre Eingangsparameter zu erfassen und Werte zu verlassen, um den interessierenden Speicherbereich zu bestimmen. Beide Tools bieten ähnliche Funktionen. Ich würde sagen, dass der Hauptunterschied darin besteht, dass sich die PIN speziell auf Intel-Prozessoren konzentriert, während DynInst ein Open-Source-Projekt ist, das verschiedene Prozessorarchitekturen (Intel, IBM-Power, ARM) unterstützt.

Da Instrumentierung in diesem speziellen Szenario teuer sein kann, das jede Anweisung instrumentiert und Sie sich leisten können, Speicherreferenzen zu probieren, würde ich Ihnen empfehlen, die PEBS-Infrastruktur [3] von aktuellen Intel-Prozessoren zu erkunden (AMD-Prozessoren haben etwas ähnliches benannt) IBS). PEBS innerhalb des Linux-Betriebssystem zur Verfügung aus dem perf-Tool verwendet werden [4] (ich weiß nicht, ob es auf anderen Osés verfügbar ist)

[1] PIN https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool

[2] DynInst http://www.dyninst.org

[3] Intel Handbuch, Abschnitt 18.4.4 Precise Ereignis Based Sampling (PEBS) http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.pdf

[4] Linux perf Speicher abzutasten Adressen https://lwn.net/Articles/531766/

0

Die bessere Werkzeug d Diesem Zweck dient die Nutzung des neuen Features in allen modernen Prozessoren, dem so genannten Hardware Performance Counter. Um auf diese Zähler zugreifen zu können, benötigen Sie eine spezielle API und ich empfehle Ihnen PAPI (PAPI: Performance API). Es bietet umfangreiche Funktionen, um auf diese Zähler zuzugreifen und alle Mikroarchitekturereignisse zu messen, z. B. Cache-Operationen, Fehlfunktionen, Gleitkommaoperationen und vieles mehr.