Quels sont les points d'arrêt?
Je viens de savoir qu'il existe données des points d'arrêt. J'ai travaillé pour les 5 dernières années en C++ à l'aide de Visual Studio, et je n'ai jamais utilisé les données des points d'arrêt.
Quelqu'un peut jeter un peu de lumière sur ce que les points d'arrêt sont, quand les utiliser et comment à utiliser avec VS?
Selon ma compréhension, nous pouvons définir les données de point d'arrêt lorsque l'on veut vérifier les changements de la valeur d'une variable. Dans ce cas, nous pouvons définir les données de point d'arrêt avec une condition sur la valeur de la variable.
D'autres exemples?
Vous devez vous connecter pour publier un commentaire.
Définition:
À partir de MSDN: Comment: Définir les Données de point d'arrêt:
Comment Définir un Changement de la Mémoire de point d'arrêt
Dans le Menu Déboguer, cliquez sur Nouveau point d'arrêt et cliquez sur les Nouvelles Données de point d'arrêt
—ou—
dans les points d'arrêt de la fenêtre de Menu, cliquez sur la Nouvelle liste déroulante et choisir de Nouvelles Données de point d'arrêt.
Le Nouveau point d'arrêt boîte de dialogue s'affiche.
Dans le champ Adresse, entrez une adresse de mémoire ou l'expression qui correspond à une adresse de mémoire. Par exemple, &foo casser lorsque le contenu de la variable toto changement.
Dans le nombre d'Octets zone, entrez le nombre d'octets que vous souhaitez le débogueur à regarder. Par exemple, si vous saisissez 4, le débogueur de regarder les quatre octets commençant à l' &foo et briser si l'un de ces octets de changement de valeur.
Cliquez sur OK.
Good ol' Daniel LeCheminant a une réponse solide sur ce de données de point d'arrêt n'est, donc, je vais jeter dans quelques anecdotes qui mettent en évidence utile utilise:
Tous les scénarios où vous savez ce va changer, mais ont peu ou pas d'idée où le code de changer de vie (car sinon vous pouvez simplement utiliser un point d'arrêt conditionnel). Plus précisément,
"Impossible" scénarios - le programme est en panne, car la variable
X
estNULL
, lorsque la variableX
ne doit jamais êtreNULL
car aucun code n'importe où jamais fixe variableX
àNULL
. Mettre un point d'arrêt normal dans le code qui initialiseX
, et quand il est atteint, ensemble de données de point d'arrêt pour regarder pour le changement deNULL
. Un peu plus commun est le cas où la mémoire est libérée trop tôt, et il y a encore des pointeurs à traîner: utilisation de données de points d'arrêt pour savoir qui est en libérant de la mémoire.Fastidieux scénarios - 3e partie de la bibliothèque est de faire des mauvais, méchant, des choses horribles à vos structures de données. Vous savez ce qui se passe, parce que quelqu'un est bousiller vos données et bien évidemment votre code est parfait. Mais vous ne savez pas où, ni quand. Bien sûr, vous pourriez en une seule étape grâce à un mégaoctet de démonté DLL... mais pourquoi s'embêter, quand vous pouvez définir un ensemble de données de point d'arrêt sur vos données, de s'asseoir et d'attendre pour elle d'obtenir saccagé!
Heisenbugs - similaire à l'impossible scénario, mais ils disparaissent quand vous regardez de trop près, telles que la normale, les points d'arrêt - même les points d'arrêt conditionnels - sont inutiles. Timing et de l'entrée utilisateur sensibles logique est particulièrement vulnérable à ce genre de chose. Étant donné que les données des points d'arrêt ne nécessitent pas le débogueur à le briser, à tous jusqu'à ce que le moment est venu, en supposant que vous pouvez venir avec un emplacement mémoire qui ne changeront que lorsque l'insaisissable bug se produit effectivement vous pouvez utiliser les données des points d'arrêt pour définir un piège pour les Heisenbug et de l'attraper en flagrant délit.
Spaghetti scénarios - commune dans le vieux, pourri bases de code où les données sont accessibles partout. Oui, vous pouvez utiliser plain ol' points d'arrêt conditionnels... mais il vous faudrait des centaines d'entre eux. Les données des points d'arrêt le rendre facile.
Jusqu'à présent, nous avons obtenu une excellente définition et une poignée de bonnes explications théoriques.
Prenons un exemple concret!
Je suis actuellement en train de travailler sur un assez gros et alambiqué de la base de code. J'ai fait un petit coffre-fort changement d'un bit de code et a commencé à arriver dans un complètement indépendants partie de la base de code - plante dans l'allocateur de mémoire. C'est généralement un signe que vous êtes en train de faire quelque chose de Mal avec la gestion de la mémoire, - soit le double de la suppression ou de l'écriture hors des limites du terrain.
Heureusement, nous avons une option pour activer le débogage gestionnaire de mémoire qui vérifie la présence de ce genre de choses. Je l'ai activée et il a immédiatement commencé à la déclaration d'un bloc de mémoire de la garde violation, ce qui signifie que quelque chose d'écrit en dehors des limites. Le problème est que ce rapport affiche uniquement lorsque la mémoire est désallouée - essentiellement en disant "hey, quelque chose était cassé. J'espère que vous pouvez comprendre ce!"
Malheureusement, cette partie de la mémoire, au moment de la libération, est complètement impossible à distinguer de milliers d'autres morceaux de la mémoire. Heureusement, notre debug cadre des balises de chaque allocation avec un consécutives ID, et la mémoire est corrompue avait une constante ID (#9667, si vous êtes curieux.) Un rapide point d'arrêt dans le gestionnaire de mémoire plus tard et j'ai été capable de trouver où que la mémoire a été allouée. Qui, comme il s'est avéré, n'est pas immédiatement utile.
Mais à ce moment, j'ai eu plusieurs composants importants:
Compte tenu de cela, j'ai pu définir une point d'arrêt sur cet octet, puis appuyez sur "go" et où la corruption s'est produite.
Qui je l'ai fait - elle conduit à une-par-une erreur dont je suis maintenant dans le processus de fixation.
Et c'est un exemple concret de la façon dont les données des points d'arrêt peuvent être utiles. 🙂
Je crois que les points d'arrêt sont les points d'arrêt qui se produit lorsque la mémoire est réglé à une certaine valeur. Par exemple, vous pouvez définir un point d'arrêt lorsque i == 10 dans une boucle for type d'arrêter après la 10ème itération. Vous pouvez également surveiller les modifications apportées aux variables sur le tas, comme attendre qu'un membre d'une classe à être modifiés.