2009-04-12 5 views
0

Nous développons une bibliothèque réseau qui utilise des sockets TCP et UDP. Cette DLL est utilisée par un client de test qui est démarré plusieurs fois sur le même PC pour un test de charge.Problèmes avec le démarrage d'un programme + DLL plusieurs fois dans Windows XP?

Sous Windows Vista, démarrer le testclient plusieurs fois n'est pas un problème. Dans Windows XP, le démarrage jusqu'à 5 fois n'est pas un problème, mais si nous le démarrons 6 fois ou plus, puis que nous fermons un client, TOUS les plantent avec des traces de pile apparemment aléatoires.

Oui, bien que nous n'utilisions aucun code interprocess (uniquement les sockets entre les clients), la fin de l'un des clients entraîne le crash de tous les clients.

Notre DLL est compilée avec MSVC et utilise les bibliothèques Boost et Crypto ++ (liées statiquement).

Une idée de pourquoi les différents processus pourraient s'influencer mutuellement?

+0

Avez-vous essayé de déboguer la fermeture du client de fermeture? Si vous faites un seul pas, vous pourriez trouver la source exacte du crash. Pourquoi cela fait planter les autres est la prochaine étape. – eran

Répondre

0

Une idée: Vous avez un bug. Sérieusement, il n'y a aucun moyen de savoir quel est votre problème sans aucune information quoi que ce soit.
Lorsqu'un processus plante, il a généralement une très bonne raison de le faire. découvrez ce que c'est. Compilez vos DLL et exécutables dans le débogage, attachez un débogueur et donnez un sens à la trace de pile que vous obtenez. Si vous obtenez une trace de pile non-sens, découvrez pourquoi.

Comme beaucoup de problèmes, celui-ci est susceptible d'être résolu par « Juste le déboguer »

+0

En particulier, essayez d'exécuter au moins deux clients sous le débogueur. Lorsque le crash "aléatoire" se produit, regardez la mémoire en cours d'accès à ce moment par tous les threads, et au code en cours d'exécution. Est-ce lié à la bibliothèque? – Arkadiy

+0

En fait, c'était en fait un bug de la suppression d'un objet à deux reprises, ce qui n'a étrangement eu lieu avec plus de clients. Je vous remercie. – Tarnschaf

1

Nous aurons besoin d'un peu plus de données pour diagnostiquer votre problème. Cependant, étant donné que la fermeture d'un client bloque tous les clients, vous devez prendre en compte toutes les façons dont les clients peuvent interagir entre eux (communication inter processus). Implicitement ou explicitement. Donc, je voudrais commencer par regarder

  • Que fait le serveur lorsque le 6ème client est fermé. Est-ce qu'il envoie un paquet spécial que les 5 autres clients ne peuvent tout simplement pas gérer?
  • Est-ce que vous lisez ou écrivez quelque chose dans le système de fichiers?
  • Utilisez-vous la mémoire partagée?

En général cependant, j'ai trouvé que d'avoir une trace de la pile apparemment aléatoire en C++ est généralement causée par une des opérations suivantes

  • la corruption des données
  • Condition de la course dans la logique de filetage.
0

La modification de la DLL ou le verrouillage de la DLL peut provoquer le blocage des programmes qui en dépendent. Généralement, les modifications de la DLL seront verrouillées par le système de fichiers, mais il est possible que dans votre application, vous fassiez quelque chose hors de l'ordinaire.

+0

merci pour la réponse, mais la DLL n'est pas modifiée pendant l'exécution du programme – Tarnschaf

Questions connexes