2016-01-08 17 views
10

Sto cercando di rintracciare gli accessi alla memoria per allocare memoria allocata.Monitor di accesso alla memoria per programmi c

Per esempio, se ho il seguente codice:

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; 
} 

Sono principalmente interessato alle funzioni che accedono alla memoria e l'indirizzo del contenuto che sono stati modificati.

ho cercato di utilizzare più strumenti di memoria come ptrace, strace, Asan, dmalloc, ma non ho ottenere il risultato.

Un'altra idea era quella di modificare la memoria cambiare la protezione della memoria usando mprotect e scrivere i gestori per gli errori di pagina. Ho fatto in modo che la memoria fosse di sola lettura e quando si verifica una scrittura, il gestore modifica la protezione della pagina e lascia che la funzione scriva il contenuto in memoria, ma dopo non riesco a leggere di nuovo la pagina, per ulteriori accessi.

Avete suggerimenti su come monitorare ogni scrittura effettuata nella memoria heap?

+1

Utilizzando 'gdb', è possibile impostare un punto di interruzione hardware sull'indirizzo. GDB li chiama * watchpoint * s.Per quanto ne so, sulla piattaforma x86, hai un limite di 4 watchpoint, ma questo potrebbe essere stato un dettaglio di implementazione? Non sono sicuro al 100% su quello. Vedi https://sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html – inetknght

+0

Hai considerato l'utilizzo di 'memcmp()'? Per i blocchi che si desidera monitorare, è possibile mantenere un _copy_, quindi verificare periodicamente che la posizione mem di interesse corrisponda ancora alla sua copia. 'memcmp (copia, posizione, posizione_lena);' – ryyker

+0

Fornire ulteriori dettagli. Ti interessano le notifiche di runtime da _within_ la tua applicazione, o usando uno strumento esterno, o il metodo di debug menzionato nei commenti è sufficiente? _ [DMalloc] (http://dmalloc.com/docs/latest/online/dmalloc_7.html) _ pubblica funzionalità che sembrano corrispondere perfettamente a ciò che hai descritto come requisiti. Quindi cosa non ha funzionato esattamente con DMalloc? – ryyker

risposta

1

Se si desidera monitorare ogni accesso alla memoria, suggerirei di dare un'occhiata ai pacchetti come PIN [1] e/o DynInst [2]. Entrambi sono pacchetti di strumenti binari dinamici che consentono di modificare un binario dell'applicazione per iniettare il codice che si desidera. In questo caso, entrambi gli strumenti consentono di strumentare ogni singola istruzione e conoscere l'indirizzo a cui fanno riferimento (se sono carichi/negozi). Quindi, se ti interessa solo la memoria allocata da malloc (o realloc o calloc), puoi anche programmare queste routine per acquisire i loro parametri di ingresso e i valori di uscita per determinare la regione di memoria di interesse. Entrambi gli strumenti forniscono funzionalità simili. Direi che la loro principale differenza è che il PIN si concentra in particolare sui processori Intel mentre DynInst è un progetto open source che supporta diverse architetture di processore (Intel, IBM-Power, ARM).

Poiché la strumentazione può essere costosa in questo particolare scenario che strumenta ogni istruzione e puoi permetterti di campionare i riferimenti di memoria, ti suggerisco di esplorare l'infrastruttura PEBS [3] dai recenti processori Intel (i processori AMD hanno qualcosa di simile chiamato IBS). PEBS può essere utilizzato dallo strumento perf disponibile all'interno del sistema operativo Linux [4] (non so se è disponibile su altri sistemi operativi)

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

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

[3] Intel Sezione Manuale 18.4.4 preciso Event 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 per assaggiare indirizzi di memoria https://lwn.net/Articles/531766/

0

Lo strumento migliore per d o questo scopo è sfruttando la nuova funzionalità di tutti i processori moderni, il cosiddetto Hardware Performance Counter. Per accedere a questi contatori, hai bisogno di un'API speciale e ti ho consigliato PAPI (PAPI: Performance API). Fornisce un'enorme funzione per accedere a questi contatori e misurare tutti gli eventi di micro-architettura come, cache sue, miss, operazioni a virgola mobile e così via.

Problemi correlati