2010-09-21 8 views
1

Supposons que, dans une session de débogage, j'ai une adresse qui pointe malheureusement vers des déchets. Et je veux examiner la mémoire autour de lui pour voir ce qui se trouve à proximité. Comme prévu, l'erreur suivante se produit:GDB: comment voir quelles adresses mémoire sont accessibles?

(gdb) x/64 $t5 
0x842da7ac:  Cannot access memory at address 0x842da7ac 

Ainsi, la question est: est-il possible de lire une plage d'adresses, dont certains ne sont pas valides?

(Plus précisément, comment puis-je savoir que dans l'exemple ci-dessus $t5+n est une adresse valide pour une 0 < n <= 64?)

Répondre

4

Vous ne pouvez pas lire les adresses invalides (évidemment).

Sur certains systèmes d'exploitation, vous pouvez interroger le système d'exploitation sur les adresses valides lorsque le processus est arrêté dans GDB. Par exemple, sur Linux cat /proc/<pid>/maps vous obtiendrez des informations sur les adresses valides (et le mode d'accès pour lequel elles sont valides). D'autres systèmes d'exploitation peuvent avoir un mécanisme similaire.

Depuis que vous avez balisé votre question post-mortem, vous ne pouvez pas utiliser le mécanisme ci-dessus; mais alors vous devez avoir un fichier core. Sous Linux (et d'autres systèmes ELF), readelf -l core vous indiquera quelles régions de la mémoire ont été écrites dans le noyau, ce qui vous donne généralement une bonne idée de la mémoire qui était valide au moment du plantage. Cependant, les mappages en lecture seule ne sont généralement pas écrits en core, donc vous ne pouvez pas voir de tels mappages dans la sortie readelf.

Tous les systèmes d'exploitation modernes utilisent la pagination, et les pages sont au moins 1K (si 4K est plus fréquent), vous pouvez donc dire que la mémoire à $t5 le plus proche qui pourrait éventuellement être valide est 0x842da800, et ainsi n >= 84 (octets). Enfin, si vous demandez à GDB d'examiner 64 mots et que GDB ne peut pas examiner le premier, il s'arrêtera. Cependant, si vous utilisez GDB-7.x, vous pouvez demander à GDB d'examiner un mot à la fois en Python, et GDB lancera une exception Python s'il ne peut pas examiner ce mot particulier. Mais puisque vous pouvez attraper des exceptions Python, il est trivial d'écrire un script qui implémentera "examinez les N prochains mots, en ignorant ceux qui sont illisibles" en Python (qui répond je crois à votre question "comment cela peut-il être fait").

+0

gdb, vous pouvez utiliser 'information entretien sections', au lieu de' cat/proc//maps' – ninjalj

+2

Non, vous ne pouvez pas:/proc//cartes montre les zones, comme sbrk et mmap, qui ne * n'appartient * à aucune section connue de GDB. –

Questions connexes