2010-07-09 4 views
1

Sous Windows, si aucun module n'est impliqué dans une pile d'appel, par exemple un vidage sur incident, tous les appels situés en dessous de ce module dans la pile sont erronés (pas seulement les noms sont manqués, mais aussi la séquence).Callstack sous Windows et Mac OS X/Linux sans symboles

Sous Linux ou Mac OS X, en l'absence de symboles, les noms de fonction ne sont pas affichés, mais la séquence d'appel est toujours conservée. Quelle différence dans le mécanisme de déroulement de l'appel ou la génération de symbole cause une telle différence?

Répondre

2

Sous Windows, il est toujours possible d'obtenir la pile d'appels complète pour les applications sans information de symbole, à condition que des «pointeurs de cadre de pile» soient placés sur la pile d'appels. Ces pointeurs de cadre de pile sont générés par le compilateur Visual Studio si vous compilez avec le débogage, mais pas si vous compilez avec optimisation (/ Ox). Par conséquent, si vous souhaitez toujours utiliser les pointeurs d'image de la pile avec optimisation, vous devez ajouter l'option/Oy- compilateur (Oy- signifie: ne supprime pas les pointeurs de l'image de la pile).

Les pointeurs de cadre de pile ne font rien de plus que pointer simplement vers la trame de pile suivante. Par conséquent, les débogueurs et les gestionnaires de déroutement peuvent facilement obtenir la pile (en regardant les pointeurs de cadre de pile pour suivre la pile, et en utilisant les adresses de retour sur la pile). Si l'application n'a pas de pointeurs de cadres de pile, le débogueur ou le gestionnaire de plantage doit utiliser les informations de débogage pour connaître le nombre d'arguments de fonction, le nombre de variables locales, ... afin d'obtenir la taille de chaque empiler le cadre et suivre toutes les trames de pile sur la pile d'appels.