2008-12-08 4 views
2

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 provoque la corruption.Comment mettre un point d'arrêt sur un emplacement mémoire dans dbx?

Est-ce possible? Si oui, quelle est la syntaxe pour produire un point de rupture au moment de la corruption? Si non, quelle serait une bonne approche pour résoudre ce genre de problème?

(Ma tactique habituelle est de regarder le contrôle de la source pour voir ce que j'ai changé récemment, puisque c'est généralement la cause, mais le code en question sonne comme si cela n'avait jamais fonctionné que par chance. travail t. de plus, je me suis déjà éliminé comme le coupable par ne jamais avoir travaillé avec le code. ;-)

+0

Vous pouvez essayer des liens avec clôture électrique https://en.wikipedia.org/wiki/Electric_Fence –

Répondre

4

Après avoir examiné plus en profondeur, il semble que la solution sur les versions récentes de dbx est quelque chose comme:

stop access w <address>, <size> 

Depuis <address> et <size> peuvent être des expressions, vous pouvez écrire des commandes comme:

stop access w &p, sizeof(int) 

Cela suppose p est un pointeur et nous voulons surveiller le premier mot il pointe.

J'ai également couru à travers un bon tutorial sur le suivi et l'écrasement des bogues de mémoire. Il utilise gdb plutôt que dbx, mais les principes devraient être les mêmes.

+1

Vous pouvez utiliser: accès 'arrêt wb & p, sizeof (int) ' pour que dbx s'arrête avant que la mémoire ne soit écrite –

0

Je ne suis pas dev Solaris, mais vous pouvez le faire avec gdb et matériel des points d'arrêt

1

Sur 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. 
Questions connexes