Comment mettre un point d'arrêt sur un emplacement mémoire dans dbx?
-
20-08-2019 - |
Question
Un collègue a un programme C qui échoue de manière prévisible en raison d'une mémoire corrompue. Il aimerait utiliser dbx
pour surveiller l'emplacement de la mémoire une fois qu'il est alloué afin de localiser le code qui cause la corruption.
Est-ce possible? Si tel est le cas, quelle est la syntaxe pour produire un point d'arrêt au moment de la corruption?
Si non, quelle serait une bonne approche pour résoudre ce type de problème?
(Ma tactique habituelle consiste à examiner le contrôle de la source pour voir ce que j'ai changé récemment, car c'est généralement la cause. Mais le code en question a l'air de ne fonctionner que par chance. En outre, je me suis déjà éliminé comme coupable en n’ayant jamais travaillé avec le code.; -)
La solution
Après avoir examiné plus en profondeur, il semble que la solution des versions récentes de dbx
soit quelque chose comme:
stop access w <address>, <size>
Etant donné que <address>
et <size>
peuvent être des expressions, vous pouvez écrire des commandes telles que:
stop access w &p, sizeof(int)
Cela suppose que p
est un pointeur et que nous souhaitons surveiller le premier mot sur lequel il pointe.
J'ai également rencontré un didacticiel sur le suivi et piétinant des bugs de mémoire. Il utilise gdb
plutôt que <=>, mais les principes devraient être les mêmes.
Autres conseils
Sous AIX, vous souhaitez utiliser stophwp:
(dbx) help stophwp
stophwp <address> <size>
Stop execution when the contents of the specified
memory region change. This is a accomplished in
hardware and may not be available on all models.
Je ne suis pas un développeur Solaris, mais vous pouvez le faire avec des points d'arrêt physiques et gdb