Je veux déboguer dans l'implémentation d'une méthode BCL [MethodImpl(MethodImplOptions.InternalCall)]
, qui est vraisemblablement implémentée en C++. (Dans ce cas particulier, je regarde System.String.nativeCompareOrdinal.) C'est principalement parce que je suis curieux et que je veux savoir comment il est implémenté. Toutefois, le débogueur Visual Studio refuse d'intervenir dans cette méthode. Je peux mettre un point d'arrêt sur cet appel:Comment puis-je déboguer dans une méthode BCL non administrée (InternalCall)?
"Hello".Equals("hello", StringComparison.OrdinalIgnoreCase);
puis afficher débogage> Fenêtres> désassemblage, l'étape dans Egaux appel, et l'étape jusqu'à ce qu'il soit à l'instruction call
x86. Mais quand j'essaie d'utiliser "Step Into" sur ce call
(que je sais de Reflector est l'appel nativeCompareOrdinal), il ne passe pas à la première instruction à l'intérieur de nativeCompareOrdinal comme je le souhaite - il passe à la place, et va directement à l'instruction x86 suivante dans Equals.
Je construis comme x86, puisque le débogage en mode mixte n'est pas supporté pour les applications x64. J'ai décoché "Just My Code" dans Outils> Options> Débogage, et j'ai "Activer le débogage de code non géré" cochée dans les propriétés du projet> onglet Déboguer, mais il continue de franchir le call
. J'ai également essayé de démarrer le processus, puis d'attacher le débogueur et d'attacher explicitement à la fois les débogueurs gérés et les débogueurs natifs, mais il n'interviendra toujours pas dans cette méthode InternalCall.
Comment faire pour que le débogueur Visual Studio entre dans une méthode non gérée?
Je ne me suis pas contenté d'une méthode, mais d'un thunk - il y a eu un appel à un JMP vers un POP EAX (pour faire sortir la valeur de retour de l'appel de la pile). Démarrage plausible pour un thunk, je suppose. Hélas, lorsque j'ai défini un point d'arrêt sur l'opcode CALL, le débogueur s'est assis là pour toujours, monopolisant le processeur mais ne se brisant jamais; et quand j'ai supprimé ce point d'arrêt et défini des points d'arrêt sur JMP et POP à la place, il est passé juste devant eux, laissant l'application se terminer sans jamais se briser. Donc je peux regarder les opcodes x86 de cette façon, mais apparemment je ne peux pas déboguer à travers eux. Bien mieux que rien, mais toujours un peu décevant. –
Il n'y a pas de thunk, je ne pense pas que vous avez trouvé le bon code. –