Tout est là dans les informations de débogage.
Voir cet exemple simple (ptr.c
).
int *global_pointer;
float global_scalar;
int main(int arg_scalar, char **arg_pointer) {
void *local_pointer;
char local_scalar;
}
Compilons et examiner le résultat woth objdump
gcc -g ptr.c && objdump --dwarf=info a.out
Il est pas trop difficile à comprendre. Il y a quelques occurrences de (DW_TAG_pointer_type)
. Dans mon exemple, il y en a quatre.
<1><8d>: Abbrev Number: 6 (DW_TAG_pointer_type)
<1><93>: Abbrev Number: 6 (DW_TAG_pointer_type)
<1><a0>: Abbrev Number: 8 (DW_TAG_pointer_type)
<1><b8>: Abbrev Number: 6 (DW_TAG_pointer_type)
Notez les nombres hexadécimaux devant eux, et chercher des sections les contenant sous forme DW_AT_type : <0xb8>
. La section entière avec le type 0xB8 est:
<1><a2>: Abbrev Number: 9 (DW_TAG_variable)
<a3> DW_AT_name : (indirect string, offset: 0x3a): global_pointer
<a7> DW_AT_decl_file : 1
<a8> DW_AT_decl_line : 1
<a9> DW_AT_type : <0xb8>
<ad> DW_AT_external : 1
<ae> DW_AT_location : 9 byte block: 3 78 8 60 0 0 0 0 0 (DW_OP_addr: 600878)
Il est le nom de la variable, et la ligne, il a été déclaré dans un numéro de dossier aussi, mais je n'ai qu'un seul fichier source, il est donc toujours 1.. C'est tout ce dont vous aurez besoin pour le trouver, peut-être avec l'aide de awk
, sauf si vous avez fait quelque chose de vraiment moche comme déclarer une variable globale et ensuite une variable locale ayant le même nom, le tout sur une seule ligne. Peu probable s'il y a une certaine norme de codage :)
Mais vous pouvez avoir une variable 'ab abc' dans certaines fonctions et' char * abc' dans d'autres, dans le même fichier ... – rodrigo
Donc une recherche de snipe c'est. Qui t'es emmerdé? – EOF
@rodrigo: c'est vrai. Ce n'est peut-être pas faisable pour l'automatisation après tout ... :( –