2017-09-18 2 views
1

Ich möchte das Adressraum-Layout von Intel Pin auf Linux erhalten.Wie bekomme ich Adressraum-Layout von Intel Pin auf Linux?

Zuerst versuche ich, Datei - /proc/PID/maps zu lesen und das Adressraumlayout zu erhalten. Aber wann führen Sie einen solchen Teil des Codes aus?

Wenn Sie es vor PIN_StartProgram setzen, enthält die Landkartendatei keine Regionen, wie heap;

Wenn Sie es in die Fini setzen, und haken Sie es mit PIN_AddFiniFunction(Fini, 0);, sollte es gut sein. Wenn Sie jedoch nur eine ls Ausführung verfolgen, können Sie kein outputbezogenes Adressraumlayout sehen. Das ist verkabelt.

+0

Was meinen Sie, wenn Sie sagen "Ausgabe bezogen Adresslayout"? – nitzanms

Antwort

0

Pin hat eine feinkörnigere Methode, um das Platzlayout zu adressieren. Sie können Rückrufe für Bild Lasten mit IMG_AddInstrumentFunction(), erhalten und Rückrufe für Heapzuweisungen erhalten durch Instrumentieren malloc() und free() Anrufe RTN_Replace() oder sogar mmap(), brk() und andere syscalls für Heapzuordnung mit PIN_AddSyscallEntryFunction() instrumentiert.

Beispiele für die Verwendung dieser APIs finden Sie im Pin-Lernprogramm und den Beispielen im Pin-Kit.

0

Vielleicht nicht die beste Lösung, aber es hat für mich funktioniert. Das Hauptproblem besteht darin, dass der Adressraum beim Start des Tools noch nicht vorbereitet ist. Sie können warten, bis alle Bilder geladen sind, und dann den Inhalt von procfs lesen.

Sie sollten also eine Instrumentierungsfunktion für jedes Bild hinzufügen. Fügen Sie zum Beispiel die folgende Anweisung an die Hauptfunktion:

IMG_AddInstrumentFunction(Image, 0); 

Dann sollten Sie procfs lesen, jedes Mal, wenn ein Bild geladen wird. Das ist, weil Sie nicht wissen, welches Bild das letzte Bild geladen (Natürlich, wenn Sie wissen, welches Bild das letzte ist, können Sie einfach die Datei nur einmal lesen können, nachdem das Bild geladen ist):

VOID Image(IMG img, VOID *v) 
{ 
    ... 
    /* open /proc/PID/maps and read its contents */ 
    ... 
} 

Während der Ausführung des Programms haben Sie immer die neuesten Zuordnungen des Adressraums und alles wird gut. Trotzdem sollten Sie bei Änderungen des Laufzeitlayouts immer vorsichtig sein. Situationen wie die Erhöhung des Heapspeichers müssen mit dem Systemaufruf brk() erfolgen.

Verwandte Themen