Nombreuses instances de VBCSComstackr.exe

Je viens de télécharger et d’installer Visual Studio Professional 2015 (14.0.23107.0). La première fois que j’ai ouvert notre solution (28 projets) et réalisé une solution Build -> Rebuild, ma machine de développement a connu une exploration absolue. Le processeur a été maximisé à 100% et la construction n’a jamais été achevée, même après 10 minutes.

J’ai ouvert le Gestionnaire des tâches de Windows et j’ai remarqué:> 10 tâches VBCSComstackr.exe en cours d’exécution. Lorsqu’elles sont combinées, ces tâches ont envoyé au CPU> 90%.

Une idée de la raison pour laquelle ces tâches sont si nombreuses? Un moyen d’arrêter cela?

C’est la chose la plus proche que je puisse trouver à quelqu’un d’autre qui rencontre le même problème: https://github.com/dotnet/roslyn/issues/2790

Mise à jour (8/7)

-Hans Passant, grande pensée. Mon responsable m’a fourni cette version (14.0.23107.0). Est-ce la bonne version pour la “version officielle”? Je n’ai pas sciemment installé aucune des versions par défaut de Visual Studio 2015. Je ne pense pas qu’il y ait des bits bêta.

-Kyle Trauberman, je ne suis pas familier avec les variables d’environnement dans le contexte de Visual Studio; Cependant, j’ai exécuté naïvement set DisableRosyln=true dans une fenêtre d’invite de commande VS (et MSBuild). Cela ne semblait pas avoir d’impact. VBCSComstackr.exe a été sauvegardé même après le redémarrage de VS2015.

J’ai réparé mon installation VS2015 et effectué un redémarrage. Cela n’a pas aidé.

Mise à jour de la partie 2 (8/7) – Passant, très impressionnant! Bien que le problème ne soit pas arrivé cette fois-ci, j’ai jeté un coup d’œil aux choses que vous avez décrites:

En ce qui concerne les modules chargés avec le VBCSComstackr.exe, voici ce que j’ai:

entrer la description de l'image ici

Il est intéressant de noter que nos assemblages de base .NET sont à des versions différentes. Vous êtes à 4.06.79 alors que je suis à 4.06.81.

Mes “dlls côté client” (situées à C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin \ Microsoft.Build.Tasks.CodeAnalysis.dll) ont la même version et le même horodatage que le vôtre: entrer la description de l'image ici

Curieusement, quand je regarde le code dans ILSpy, je vois quelque chose de légèrement différent – l’optimisation peut-être?

  private static NamedPipeClientStream TryAllProcesses(ssortingng pipeName, int timeoutMs, CancellationToken cancellationToken, out ssortingng newPipeName) { ssortingng str = pipeName; int num = 1; while (File.Exists(ssortingng.Format("\\\\.\\pipe\\{0}", pipeName))) { NamedPipeClientStream result; if ((result = BuildClient.TryConnectToProcess(pipeName, timeoutMs, cancellationToken)) != null) { newPipeName = pipeName; return result; } pipeName = str + "." + num.ToSsortingng(CultureInfo.InvariantCulture); num++; } newPipeName = pipeName; return null; } 

** Permettez-moi de revenir avec vous sur l’argument spécifique de pipname transmis aux instances de VBCSComstackr.exe. Je vais devoir attendre que cela se reproduise.

Hmm, il n’y a pas de scénario de reproches évident et personne d’autre ne s’en plaint. Votre solution n’est pas du tout inhabituelle. Fixer le processeur à 100% et obtenir que le processus VBCSComstackr avale environ 1,5 Go n’est pas très difficile pour un grand projet, mais il est propre lorsque je regarde le mien.

Premier scénario possible d’échec avec des bits bêta désinstallés, un problème très courant. Utilisez le débogueur pour avoir un aperçu. Utilisez Debug> Attach to Process et choisissez l’une des instances en cours d’exécution. Ensuite, Debug> Break All et Debug> View> Modules. Faites attention aux numéros de version et aux horodatages, ils doivent ressembler à ceci:

entrer la description de l'image ici

Notez que certaines colonnes ont été cachées pour restr lisibles. Les horodatages sont le fuseau horaire CST.


C’est le côté serveur. Le côté client qui avait le bogue que vous avez découvert se trouve dans C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin \ Microsoft.Build.Tasks.CodeAnalysis.dll. Jetez un oeil sur ses propriétés, la mienne est de 85 192 octets et créée le dimanche 21 juin 2015 à 19h06: 54, numéro de version du fichier 1.0.0.50618. Vous pouvez regarder le fichier avec un décompilateur comme Reflector ou ILSpy, accédez à BuildClient.TryAllProcesses (). La ligne pertinente avec le correctif est la suivante:

 for (int i = 1; File.Exists(ssortingng.Format(@"\\.\pipe\{0}", pipeName)); i++) 

La version buggy manquait \\.\pipe\ .


Notez que la vérification des erreurs est très insuffisante dans l’extrait de code ci-dessus, File.Exists () renvoie false pour plusieurs raisons. C’est aussi la raison fondamentale pour laquelle le bogue n’a pas été découvert plus tôt. Cela permet plusieurs modes de défaillance possibles, ceux qui sont activés si votre machine est infectée par les logiciels malveillants classiques à format rétréci que les programmeurs installent volontairement. Le serveur et le code client se connectent les uns aux autres via un canal nommé avec un nom spécial. Quelque chose que vous pouvez voir dans le Gestionnaire des tâches, onglet Processus. Utilisez View> Select Columns (Win8 et supérieur: cliquez avec le bouton droit sur l’en-tête de colonne) et cochez l’option “Ligne de commande”: entrer la description de l'image ici

Notez l’argument -pipename . Si l’appel File.Exists () renvoie false, MSBuild redémarrera VBCSComstackr.exe. Si vous voyez toutes ces instances s’exécuter avec le même argument -pipename, des logiciels s’exécutant sur votre ordinateur interfèrent avec l’utilisation normale du canal nommé. La première chose à considérer est de rechercher une solution anti-malware moins agressive. Vous pouvez écrire un petit programme de test qui utilise l’espace de noms System.IO.Pipes pour obtenir un meilleur message d’exception.

Une idée de la raison pour laquelle ces tâches sont si nombreuses?

Roslyn utilise un processus de compilation partagé qui conserve votre code compilé en mémoire pour une réutilisation ultérieure dans les compilations. Donc, la deuxième compilation sera plus rapide, mais comme vous avez vu il y a une surcharge de mémoire.

Un moyen d’arrêter cela?

Oui. A partir de là, il y a une propriété de la tâche de compilation dans msbuild qui désactive le compilateur partagé, et il est défini sur true par défaut .

Donc, dans chaque projet, vous devrez append cette propriété au fichier de projet. Ou, dans Visual Studio 2015, il existe désormais des projets partagés, dans lesquels vous pouvez append cette propriété au projet partagé, puis inclure ce projet partagé dans tous les autres projets nécessitant ce paramètre.

  false  

Au 22 novembre 2015, ce problème m’arrivait toujours dans l’édition communautaire de Visual Studio 2015. Mon ordinateur portable commençait à doubler en tant que radiateur spatial avec toutes les instances de VBCSComstackr fonctionnant à plein régime.

Le seul correctif qui a fonctionné pour moi était de localiser le fichier VBCSComstackr.exe dans le répertoire / bin / roslyn de l’application Web et de modifier les permissions de sécurité sur celui-ci.

Vous devez refuser les droits de lecture et d’exécution pour l’AppPool sur lequel votre application Web est exécutée.

entrer la description de l'image ici

Selon Slaks, vous pouvez désactiver roslyn (ce que semble être le DisableRoslyn ) en définissant la variable d’environnement DisableRoslyn sur true .

Voir http://blog.slaks.net/2014-05-21/exploring-roslyn-part-2-inside-end-user-preview/ pour plus d’informations.

Notez que le lien ci-dessus est pour l’aperçu, mais je ne peux pas imaginer que cela aurait beaucoup changé entre ce moment et maintenant.

Vous pouvez également modifier l’option “keep alive” pour VBCSComstackr, pour la fermer juste après l’exécution … Vous devez modifier le fichier “VBCSComstackr.exe.config” (“C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin \ VBCSComstackr.exe.config “) et définissez la valeur nécessaire en secondes (600 par défaut).

Vous avez également rencontré ce problème avec Visual Studio Enterprise 2015, mise à jour 1. Le problème a été résolu en effectuant une mise à niveau vers la mise à jour 2.

J’ai constaté que changer l’identité en «NetworkService» dans les parameters avancés du pool d’applications éliminait le problème pour moi.