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").
gdb, vous pouvez utiliser 'information entretien sections', au lieu de' cat/proc//maps' –
ninjalj
Non, vous ne pouvez pas:/proc//cartes montre les zones, comme sbrk et mmap, qui ne * n'appartient * à aucune section connue de GDB. –