2015-03-10 10 views
6

Ho ottenuto un coredump di un processo che si è bloccato (difficile da riprodurre).Esame delle variabili locali ha restituito la funzione

ho capito che qualcosa va storto in una funzione che è appena tornato (ha restituito un puntatore NULL piuttosto che un puntatore non NULL).

Sarebbe di grande aiuto per me sapere il contenuto delle variabili dello stack in quella funzione. Penso che sulla maggior parte delle architetture, il ritorno da una funzione significhi semplicemente cambiare il puntatore dello stack. In altre parole, quei valori sono ancora lì (sotto il puntatore dello stack, se prendiamo x86 come esempio).

Qualcuno può confermare che il mio ragionamento è corretto e magari fornire un esempio come farlo con gdb?

Il mio ragionamento vale anche per MIPS?

+1

In gbd prova 'help x'. – alk

risposta

4

Le variabili locali potrebbero essere state memorizzate nello stack, ma non necessariamente. Se è presente solo un piccolo numero di variabili che si adattano ai registri e il codice è ottimizzato, le variabili locali non sono mai state salvate nello stack. A seconda della convenzione di chiamata utilizzata, i valori finali delle variabili locali possono ancora persistere nei registri.

Disassemblare la funzione in questione (è possibile utilizzare objdump -dS per fare ciò, in modo da poter facilmente correlare la fonte). Guarda come sono state accedute le variabili locali. Sono stati conservati in memoria o registrati? I registri erano già stati ripristinati in base al loro valore rilevante per il chiamante?

Se il valore del registro originale non è stato ripristinato, è sufficiente esaminare il registro utilizzato per memorizzare locale. Se è già stato ripristinato, probabilmente è perso.

Se i valori locali sono stati memorizzati nello stack, il prologo della funzione (prime istruzioni) dovrebbe indicare come manipolare il puntatore stack e frame. Tenendo conto che la chiamata è stata salvata nello stack (PC salvato), è possibile calcolare il valore del puntatore stack/frame usato in quella funzione. Quindi usa x per esaminare le posizioni di memoria.

A seconda della funzione chiamata, è anche possibile esaminare i relativi argomenti (se chiamati) e ricalcolare il valore delle variabili locali.

0

Si può vedere variabile locale che non è essere ottimizzato utilizzando:

info locals 

Non può funzionare in una funzione che già tornare, però. Se riesci a eseguire nuovamente quel programma, prova a inserire un punto di interruzione prima che la funzione ritorni.

In caso contrario, è possibile esaminare manualmente lo stack utilizzando x/x e info register per conoscere l'indirizzo del puntatore dello stack.

È quindi possibile sfogliare lo stack utilizzando up e down.

+0

Se la funzione è già terminata, i locali non sono più in pila. – urzeit

+0

Oh, è tornato. Non l'ho notato. – blue112

Problemi correlati