2009-06-07 7 views
1

J'ai des problèmes avec l'un des projets sur lesquels je travaille sous Windows (64 bits). Le programme plante parfois, parfois non, et je suspecte que le problème soit lié à plusieurs runtime C liés. Comment puis-je détecter cela sur Windows? J'ai essayé avec depends.exe, mais il n'a pas signalé le CRTDétection de plusieurs runtimes C liés sur des fenêtres

+0

Où est l'accident? Avez-vous une trace de pile ou quelque chose? – Macke

+0

Quelque part dans le runtime C, sans aucune trace de pile, malheureusement ... –

Répondre

3

Il est plutôt improbable que vous puissiez lier statiquement avec plusieurs bibliothèques d'exécution C - vous rencontreriez de nombreux conflits de définition de symboles qui produiraient au moins des avertissements volumineux, et Seul un ingénieur insouciant les ignorerait. Avec depends, avec depends, je m'assurerais d'utiliser l'option de profilage dynamique, pour vérifier toutes les dépendances pour les CRTL dynamiques qu'ils chargent. Si rien ne se passe, je soupçonne que votre problème est ailleurs. Je suppose que votre problème est ailleurs dans tous les cas, car les DLL avec API de niveau C ne doivent pas, en règle générale, s'appuyer sur l'état partagé dans le CRTL - le plus souvent l'allocateur de mémoire - et devraient adopter un protocole normalisé pour la gestion de la mémoire inter-API, comme l'allocation d'appel, l'utilisation d'appel ou l'envoi de rappels d'allocation de mémoire, etc. En d'autres termes, plusieurs CRTL dans le même processus ne posent normalement pas problème. protocole de gestion de la mémoire.

Pour les échecs transitoires, je pense que le multithreading ou la corruption de tas.

+0

Je vais regarder dans l'option de profilage dynamique, merci En ce qui concerne l'état partagé de CRLT, je ne pense pas que je peux faire quelque chose à ce sujet. C'est pour une extension python, et je ne contrôle simplement rien sur la partie d'allocation de mémoire (refcounting). Je suis surpris par votre affirmation selon laquelle plusieurs CRT ne sont pas un problème - je suis loin d'être un spécialiste de Windows, mais j'ai toujours lu que cela devrait être évité de plusieurs sources. Je comprends que cela peut être évité en faisant attention, mais je ne pense pas que ce soit faisable dans mon cas (car je ne contrôle pas toutes les parties de l'exécutable final). –

+0

La plupart du temps que vous utilisez une DLL sur Windows, vous n'avez pas la source et ne pouvez pas contrôler quelle bibliothèque d'exécution il utilise. Ce n'est pas comme Linux, où il y a la bibliothèque GNU C, et chaque bibliothèque partagée peut (normalement) croire que malloc résout le même allocateur à travers le processus. De plus, les DLL peuvent être écrites dans différentes langues; une DLL Pascal utilisée dans un fichier C EXE, ou vice versa, ne peut pas partager les bibliothèques d'exécution, car elles ont des exigences différentes. Ainsi, une convention ou un protocole de gestion de la mémoire doit être suivi. –

+0

J'ai finalement réussi à obtenir une trace de pile, et le problème est en effet un FILE * passé à travers les limites de la DLL. Donc je suppose que je vais devoir faire sans quelque chose. Connaissez-vous une référence concernant le protocole pour les limites dll sur les fenêtres? Je ne suis vraiment pas familier avec le sujet, et j'ai peur de devoir le traiter à plusieurs endroits dans les bases de code sur lesquelles je travaille. –

Questions connexes