1

yop,
je vais séparer le problème en deux questions séparées :

1° imaginons que je veuille contrôler le nombre de malloc/free effectués ds un prog, mais sans modifier les sources pr remplacer tous les appels à malloc par un alias à moi, y'a une méthode simple de procéder ? je serais tenté de simplement linker un fichier contenant une fonction "malloc" ac le même prototype que la vraie, pour obliger mon prog à utiliser celle-ci, mais du coup j'ai plus accès à la vraie (ou alors elle existe ac un autre nom standard ?)

2° y'a des fonctions natives efficaces pour remplacer dup2 et fork sous windows (autre que CreateProcess pr fork, par exemple, bicause ça fait retoucher pas mal de code même si le résultat a des chances d'être plus efficace ensuite)

mci happy
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

2

Zephyr
: 1° imaginons que je veuille contrôler le nombre de malloc/free effectués ds un prog, mais sans modifier les sources pr remplacer tous les appels à malloc par un alias à moi, y'a une méthode simple de procéder ? je serais tenté de simplement linker un fichier contenant une fonction "malloc" ac le même prototype que la vraie, pour obliger mon prog à utiliser celle-ci, mais du coup j'ai plus accès à la vraie (ou alors elle existe ac un autre nom standard ?)

ya ptet des fonctions selon le compilateur/linkeur, par exemple avec "ld" ya un machin pour wrapper une fonction (edit: et pouvoir appeler l'originale) mais ça marche pas terrible

3

Zephyr
: 1° imaginons que je veuille contrôler le nombre de malloc/free effectués ds un prog, mais sans modifier les sources pr remplacer tous les appels à malloc par un alias à moi, y'a une méthode simple de procéder ? je serais tenté de simplement linker un fichier contenant une fonction "malloc" ac le même prototype que la vraie, pour obliger mon prog à utiliser celle-ci, mais du coup j'ai plus accès à la vraie (ou alors elle existe ac un autre nom standard ?)

Si tu veux pas toucher aux sources mais que tu peux modifier les makefiles, tu peux essayer de rajouter -Dmalloc=zephyr_alloc à CFLAGS #gore# happy
2° y'a des fonctions natives efficaces pour remplacer dup2 et fork sous windows (autre que CreateProcess pr fork, par exemple, bicause ça fait retoucher pas mal de code même si le résultat a des chances d'être plus efficace ensuite)

Peu probable, mais attends que qqun de mieux informé que moi confirme ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

4

Pollux :
Si tu veux pas toucher aux sources mais que tu peux modifier les makefiles, tu peux essayer de rajouter -Dmalloc=zephyr_alloc à CFLAGS #gore# happy

j'y ai pensé, mais ça a des chances de faire autre chose que niquer le header standard et de me faire une erreur "zeph_malloc undefined" au linkage ? (à supposer que le remplacement s'est fait correctement ^^)
bon j'essaierai quand j'aurai l'occasion tfaçon, ça coute rien grin
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

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 =>
KcgShot3.gif(à 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é.

6

1) heu vi je connais valgrind, mais je suis sous win et netbsd (enfin y'a moyen de tester le projet sur des linux ms je cherchais une solution interne à mon programme)

2) ok
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

spectras :
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é.

En meme temps, c'est peut-etre plus simple de faire des fork/vfork a la volé pour faire du multitache, mais le multithread reste quand meme plus propre au niveau conception.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

8

Euh tu peux argumenter ? Parce que je vois pas ce que le multithreadé apporte lorsque tu n'as pas besoin de communications entre les deux instances de serveur, c'est à dire dans 99% des cas ? A l'inverse je vois les inconvénients évidents : si une erreur arrive sur l'une des requêtes c'est toutes les autres qui sont potentiellement impactées, avec tout ce que ça implique en terme de sécurité et de niveau de service.

9

ah tiens tant que j'y suis, ms pr celle là à mon avis faut pas rêver : pipe() sous windows j'oublie aussi ? grin
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

10

Zephyr
: 1° imaginons que je veuille contrôler le nombre de malloc/free effectués ds un prog, mais sans modifier les sources pr remplacer tous les appels à malloc par un alias à moi, y'a une méthode simple de procéder ?
Tu fais une bibliothèque partagée (.so) avec tes malloc/free dedans, en utilisant dlsym(3) pour appeller les versions originales. Puis tu executes ton binaire avec LD_LIBRARY_PATH qui contient le chemin vers ta bibliothèque wrapper, ça devrait marcher.
So much code to write, so little time.

11

ah pas con, thx happy
(c'est ni portable ni particulièrement pratique ms au moins ça marchera sous netbsd ^^)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

12

Pour équivalent à pipe(), tu as CreatePipe() qui te donne deux handles...

Et si tu tiens à bosser avec des descripteurs au lieu des handles, tu peux utiliser _open_osfhandle(), qui est l'équivalent de fdopen() à un niveau en-dessous (d'ailleurs, fdopen() marche aussi. Voir le code source de la classe MFC CStdioFile pour des exemples).

Sinon, en effet, il parait que le kernel de WinNT supporte le fork, mais il n'y a rien d'exporté pour cela (pas en Win32, en tout cas). Il faut dire que si CreateProcess() a de gros inconvénients par rapport à fork() tout seul, il a de gros avantages par rapport à fork()+exec().

PS: sous Windows, on peut passer un socket à un processus fils. Il suffit de le rendre héritable (ou plutôt, le dupliquer avec DuplicateHandle(fInheritHandle=TRUE) et d'activer fInheritHandles lors du CreateProcess() (au prix, hélas, de la vitesse, parait-il 200 fois plus lente qu'un fork() seul). Et bien sûr, il faut trouver un moyen de dire au processus fils qu'il a le socket en question (soit en lui passant son numéro par la ligne de commande, soit en le passant à la place des handles standard comme le fait inetd).
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

13

oula, pk pour CreatePipe(), pr le reste je vais pas trop chercher, mci ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

14

soit en le passant à la place des handles standard comme le fait inetd
Oui. A noter en plus que ces handles standard ne sont pas 0 1 et 2, ce qui ne simplifie pas les choses.

15

PS:
Pour jouer avec les processus fils et les pipes (ça doit marcher aussi avec les sockets, je pense) :
Creating a Child Process with Redirected Input and Output

Cela pourrait t'intéresser, indirectement...

Edit cross spectras:
bof... un petit GetStdHandle() résout le problème...
Et puis, 0, 1 et 2 ne sont pas des handles, ce sont des descripteurs (le niveau au-dessus).
D'ailleurs, dans un processus console, même avec les entrées/sorties redirigées, les descripteurs standard doivent marcher...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

16

Ouép, j'ai toujours été impressionné par la quantité de texte qu'il faut pour l'équivalent d'un pipe() fork() execve()

17

Peut-être, mais il faut une belle quantité de texte pour être sûr que ton fork+execve a bel et bien marché (et c'est impossible si le programme lancé par exec() n'est pas un programme à toi) : Tu peux savoir que ça a foiré, mais pour savoir si le prog est lancé ou non, tu peux seulement tester "ah, il ne s'est pas terminé au bout de 2 secondes, c'est qu'il doit être en marche").

Sous Windows, tu testes juste le retour de CreateProcess().


D'ailleurs, le programme montré par MSDN est assez nul: Il part d'un pipe héritable pour en créer un double non-héritable, alors que l'inverse est plus simple.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

18

Peut-être, mais il faut une belle quantité de texte pour être sûr que ton fork+execve a bel et bien marché (et c'est impossible si le programme lancé par exec() n'est pas un programme à toi) : Tu peux savoir que ça a foiré, mais pour savoir si le prog est lancé ou non, tu peux seulement tester "ah, il ne s'est pas terminé au bout de 2 secondes, c'est qu'il doit être en marche").
Huuu ?
Tu veux faire quoi exactement, je vois pas après quoi tu rales ?
- si tu veux dialoguer avec lui, ben tu vois parfaitement s'il est lancé ou pas
- si tu attends qu'il soit fini, tu récupères son code retour avec waitpid() (éventuellement de façon asynchrone)
- dans les autres cas, tu te fous de savoir s'il a été lancé correctement ou non

Que voudrais-tu d'autre au juste ? hum

19

Ce que je cherchais à faire quand j'ai essayé, c'était lancer un programme, n'importe lequel, à la demande de l'utilisateur et en arrière-plan (comme le fait un shell avec &, quoi). Mais je voulais que le processus père sache lui-même s'il avait réussi ou non, et cela n'est pas possible, à moins de vouloir dialoguer avec le programme chargé (qui peut être n'importe quoi, et non pas un programme spécifique).

Ainsi, en cas d'échec, le processus fils peut encore prévenir le père.
En cas de succès, si tu ne sais pas comment communiquer avec le nouveau programme, tu ne peux pas avoir confirmation qu'il tourne. Le processus père n'aura de nouvelles du nouveau programme que lorsque celui-ci aura terminé son exécution.


Sous Windows, la création du processus et le chargement du programme se font en une seule étape. Si CreateProcess() a retourné une valeur non-nulle, c'est que le programme est chargé et tourne.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

20

Si CreateProcess() a retourné une valeur non-nulle, c'est que le programme est chargé et tourne.
Ce qui ne te sert absolument à rien vu que ça ne te renseigne pas sur le résultat de l'initialisation du programme.

Le chargement n'est qu'une partie de l'initialisation, et ce qui t'intéresse c'est de savoir si toute l'initialisation à réussi, ou alors de rien savoir.

Concrètement : que l'erreur soit que le programme n'a pas été trouvé, ou que tu n'aies pas passé les bons arguments, t'en as rien à faire. Ca a raté, point.

Le fait est que sans communiquer avec le processus fils (un simple waitpid, ou son équivalent windows suffit pour ça), il est totalement impossible, CreateProcess ou pas, de savoir s'il a été lancé avec succès.

Ce que tu cherchais à faire était mal défini wink

21

Pour cela, tu as sans doute raison. Mais je préfère lancer un nouveau processus un une fois quand même.
Quant à "la quantité de texte qu'il faut pour l'équivalent d'un pipe() fork() execve()", tu n'as pas les mêmes possibilités non plus (à commencer par les possibilités inter-utilisateur avec les descripteurs de sécurité, ou pour les processus avec fenêtre).
Et aussi, le programme redirige TOUS les handles standards et fait une démonstration de leur utilité.

(à cela près qu'un waitpid ne permet de savoir que quand le processus se termine (ou subit un autre signal utilisateur, mais voisin). Pour lancer un démon, c'est pas top)
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

22

nitro
: Tu fais une bibliothèque partagée (.so) avec tes malloc/free dedans, en utilisant dlsym(3) pour appeller les versions originales. Puis tu executes ton binaire avec LD_LIBRARY_PATH qui contient le chemin vers ta bibliothèque wrapper, ça devrait marcher.

bon ayé testé, ça segfault avant même d'appeler ma fonction malloc :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

23

Si tu veux de l'aide va falloir montrer du code ^^
So much code to write, so little time.

24

va surtout falloir que j'isole le bug sinon ça va pas donner envie d'être lu ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

25

tu peux aussi regarder du côté d'electric fence... (libefence)
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

26

heu oué c'est un truc un peu comme ça que je veux faire à vrai dire, ms adapté à mon projet (par contre aller voir les sources d'efence, ça c'est pas con ^^)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

27

tutafé
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

28

Vertyos > Pourquoi est-ce que ça t'embête de remplacer malloc par my_malloc dans tes sources ?
avatar
I'm on a boat motherfucker, don't you ever forget

29

parceque :
- quand je vais rendre le projet, il faudra que je revienne en arrière pr remettre le vrai malloc
- le projet est relativement gros, donc je préfererais éviter de tout remplacer (d'avance, "nianiania sed niania" : non.)
- dans l'idée, c'est un truc que je veux utiliser comme libefence, c'est à dire une seule fois pour vérifier les erreurs mémoires, si ça oblige à modifier les sources c'est pas top
- si ça marche bien, je le réutiliserai pê pour d'autres projets, de la même façon, pour effectuer une vérification juste une fois sans tout recompiler
vala vala ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

30

Zephyr :
- quand je vais rendre le projet, il faudra que je revienne en arrière pr remettre le vrai malloc

Qu'est-ce qui te gêne dans le fait d'utiliser systématiquement ton propre wrapper, même si ce sera simplement un alias de malloc dans la release finale ? Perso si je devais noter un projet j'enlèverais pas des points à cause du fait qu'il y a une infrastructure de debug, au contraire triso (maintenant peut-être que vous êtes notés sur des critères débiles, je sais pas)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)