1) regarde valgrind
Ca ne marche que sur ix86(/64) et PPC, et seulement sous linux à ma connaissance, mais c'est assez puissant.
C'est une suite d'outils de debugging, qui ne nécessitent même pas de recompilation, étant donné qu'ils travaillent directement au niveau du binaire. Ils reconnaissent les infos de debug. Exemple de fonctionnalités :
- détection d'utilisations de mémoire non initialisée (au runtime, donc)
- détection d'utilisations de mémoire après qu'elle ait été libérée
- débordements de buffer (pile et tas)
- fuites de mémoire (et il sait te donner la ligne dans ton souce où tu supprimes ton dernier pointeur vers le bloc)
- détection d'utilisations non safe de memcpy / strcpy / etc (notamment quand la source et la destination se chevauchent)
- détection de race conditions
- profiler d'allocations
- profiler d'appels
- profiler de cache, L1 et L2
Et si t'as un KDE, tu peux utiliser kcachegrind avec le profiler, pour avoir ce genre d'infos =>

(à gauche, une autre vue du callgraph, l'aire du rectangle de chaque fonction étant proportionnelle au temps CPU consommé par ladite fonction)
Enfin bon on s'éloigne du sujet initial là, mais oui, valgrind sait faire ça, sans même avoir à recompiler.
2) non, il n'existe aucun équivalent à fork() sous windows. En tous cas pas en win32 (ptet que en nt natif ça existe j'en sais rien mais en même temps....qui écrit des applications nt natives, sérieusement ?)
C'est pour ça que tu trouves aucun serveur multiprocessus sous windows. Même apache a été transformé en serveur threadé quand il a été porté.