7
votes

Lorsqu'un programme C ++ se termine sous Windows Quelle est la dernière fonction appelée par le talon de terminaison?

Cette question concerne l'ingénierie inverse et la bibliothèque Microsoft Standard C.

Lorsqu'un programme C tere très gracieusement, c'est-à-dire un retourner 0; à la fin de principal () . Qu'est-ce qui se passe tout (généraliser s'il vous plaît). Spécifiquement, quelle est la fonction dernier appelée par la bibliothèque C?


7 commentaires

Afaik Main vient de retourner et c'est tout ...


Bonne question, mais je suppose que vous pouvez écrire "Hello World", mettre un point d'arrêt et inspecter la pile d'appels jusqu'au point d'entrée du programme.


@Tony: Eh bien, à un moment donné, le programme doit demander au système d'exploitation "Terminer moi s'il vous plaît, monsieur" - quelque chose comme ExitProcess ().


BTW Je crois que la réponse sera dépendante de la mise en œuvre.


@Shacharpôt, mais comme vous dites, cela dépendra de ce que le système d'exploitation va alors le tuer, op demeurant sur la bibliothèque C


@Tony: Bien sûr, c'est pourquoi je crois que c'est dépendant de la mise en œuvre et la bonne réponse est "Il n'y a pas de fonction standard pour cela, c'est des détails de la bibliothèque intérieure".


@shacharptooth ExitProcess () est probablement la réponse que je cherchais .. Lemme check.


3 Réponses :


2
votes

Si vous avez strace sur votre machine, vous pouvez l'utiliser (l'appeler via strace ./program ) - sur ma machine, avec le code suivant, il donne exit_group (0) comme dernière fonction: xxx

comme pour ce qui se passe (avertissement: balayage généralisations à venir), le système d'exploitation (théoriquement) devrait tenter de démarrer la récupération mémoire de votre processus en supprimant toute la mémoire que vous avez laissée new'd.


4 commentaires

Il existe sous Cygwin, mais ce n'est pas trop difficile de travailler si l'Op examine de toute façon une ingénierie inverse.


En outre, l'outil analogue sous Windows est stracent - intellectuelheaven.com/default. ASP? BH = Projets et h = strace.htm


Un système d'exploitation normal ne dérangera pas «Supprimer toute la mémoire que vous avez laissée New'd». Ça ne se soucie même pas. C'est parce que nouveau est entre vous et le temps d'exécution. Le système d'exploitation fournit juste des morceaux de mémoire brute à votre processus et récupère ceux-ci. En particulier, il ne dirigera pas les destructeurs (quel Supprimer fait).


Oui, peut-être que le mot supprimer était trompeur. Je voulais dire que l'opérateur supprime, mais en termes de suppression ....



9
votes

Vous pouvez trouver les sources du Microsoft CRT dans "% Program Files% \ Microsoft Visual Studio X.0 \ VC \ CRT \ SRC".

Le point d'entrée pour exécutables ( maincrtstartup ) est dans CRT0.c, ou, au cas où la DLL d'exécution est utilisée, dans CRTEXE.C. Vous pouvez voir qu'après avoir appelé principal () il appelle sortie () . Le code source de sortie () est en crt0dat.c. Il appelle les gestionnaires de terminaison C et C ++ (fermeture des poignées STDIO, etc.), appels Atexit () fonctions et enfin __crtexitprocess () qui appelle ExitProcess de Kernel32 ()


2 commentaires

La source CRT n'est pas disponible dans les éditions Express de Visual Studio.


Vrai, mais vous n'avez pas dit que vous avez une édition express. Vous pouvez également installer une version d'essai de la pleine édition et vérifier la source là-bas.



0
votes

Je suis tombé sur la même question et j'ai trouvé ma réponse. Fortement espérons que je ne me tromperai pas, mais je vais aller avec le principe des "chiffres de ne pas mentir".

Ce dernier lorsqu'un processus arrêté serait: P>

ntdll!LdrShutdownProcess -> ntdll!RtlExitUserProcess -> msvcrt!__crtExitProcess -> msvcrt!doexit -> msvcrt!exit


0 commentaires