Question

Voici quelque chose que je sais est probablement possible mais que je n'ai jamais réussi à faire.
Dans VS2005 (C ++), Pendant le débogage, pour pouvoir appeler une fonction à partir du code en cours de débogage.
Cette fonctionnalité est parfois essentielle lors du débogage de structures de données complexes qui ne peuvent pas être explorées facilement en utilisant uniquement les fonctionnalités normales de la fenêtre de surveillance.
La fenêtre de surveillance semble autoriser l’écriture d’appels de fonction, mais chaque fois que je l’essaye, cela me donne une erreur ou une autre.

Erreur: symbole " func " non trouvé
Erreur: la liste d'arguments ne correspond pas à la fonction
Erreur: fonction membre absente

Quelqu'un a-t-il jamais réussi à faire ce travail correctement? Qu'est-ce qui me manque ici?

Modifier: clairement, la fonction appelée doit être un symbole existant dans l'étendue actuelle du débogueur.

Était-ce utile?

La solution

Ok, voici ce que j'ai trouvé
CXX0040 signifie que " L'évaluateur d'expression C ne prend pas en charge les conversions implicites impliquant des appels de constructeur. "
CXX0047 signifie que les fonctions " surchargées" ne peuvent être appelées que s'il existe une correspondance de paramètre exacte ou qui ne nécessite pas la construction d'un objet. "

Donc, combiné, cela signifie que si je veux appeler une fonction, aucun des arguments ne doit avoir une conversion implicite ni nécessiter une construction.
" conversion implicite " dans ce contexte, semble inclure des choses triviales telles que la conversion de 'String' en 'const String & amp;' .
" construction " semblent inclure une construction de copie triviale. si vous transmettez par valeur tout ce qui n'est pas un type primitif, vous obtiendrez une erreur.

Cela laisse donc essentiellement des fonctions qui prennent uniquement des types primitifs ou des pointeurs.
Je viens de tester cette théorie avec succès.

Donc, si vous voulez pouvoir appeler une méthode à partir de la fenêtre de surveillance, ajoutez une surcharge qui ne prend que des pointeurs et des primitives et dans la fenêtre de surveillance, transmettez les arguments de manière appropriée. Pour transmettre un objet qui n'est pas une primitive, transmettez son adresse.

Autres conseils

La fenêtre de surveillance est limitée par le contexte dans lequel votre code actuel est, par exemple, lorsque votre code entre dans une fonction et que vous essayez d'accéder à une autre fonction qui est masquée dans le cadre de votre fonction actuelle, cela ne fonctionnera pas.

Si vous appelez une fonction dans la fenêtre de surveillance, assurez-vous qu'elle est visible et accessible depuis l'étendue actuelle.

À ma connaissance, vous ne pouvez pas exécuter de code depuis la fenêtre d'observation lors du débogage de C ++ non géré. Cela fonctionne pour C # (et probablement VB.NET et C ++ géré, mais je ne suis pas positif à ce sujet). Il est donc probable que cela le permette, car cela fonctionne pour certaines langues mais pas pour d'autres.

Nous trouvons que cela fonctionne très souvent. Certaines fonctions très simples (y compris les fonctions membres) fonctionnent, en général des accesseurs de propriétés simples. D'autres fonctions plus complexes ne fonctionnent pas et génèrent une erreur.

Je n'ai jamais été capable de discerner les règles précises ...

Je n’ai pas testé cela, mais j’ai toujours pensé que c’était la fenêtre immédiate (code d’exécution)

Cameron

C’est le " Immediate " fenêtre que vous voulez. Et vous êtes limité à ce qui est visible à partir de votre point d'arrêt actuel. Variables locales et fonctions de cette classe (ou globales)

D'après mon expérience, la fenêtre immédiate présente quelques lacunes. Vous ne pouvez pas appeler les fonctions membres de vos classes si les classes proviennent d'une autre DLL, mais obtenez des messages d'erreur trompeurs. Si quelque chose se trouve dans la même DLL (par exemple, en liant statiquement dans tous les autres éléments), l’appel des membres est relativement fiable. Mais des choses complexes peuvent ou ne peuvent pas fonctionner, comme mentionné par d'autres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top