La méthode standard serait la suivante :
if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1)
printf("traced!\n");
Dans ce cas, ptrace renvoie une erreur si le processus actuel est tracé (c'est-à-dire en l'exécutant avec gdb ou en s'y attachant).
Mais il y a un sérieux problème avec ceci : si l'appel retourne avec succès, gdb peut ne pas s'y attacher plus tard. Ce qui est un problème puisque je n'essaie pas d'implémenter un système anti-débogage. Mon but est d'émettre un 'int 3' lorsqu'une condition est remplie (c'est-à-dire qu'une assert échoue) et que gdb est en cours d'exécution (sinon j'obtiens un SIGTRAP qui arrête l'application).
Désactiver SIGTRAP et émettre un 'int 3' à chaque fois n'est pas une bonne solution car l'application que je teste pourrait utiliser SIGTRAP dans un autre but (auquel cas je suis toujours dans la merde, donc ça n'aurait pas d'importance mais c'est le principe de la chose :)).
Gracias
1 votes
Vous devez trouver quelque chose comme IsDebuggerPresent sur POSIX
2 votes
@Svisstack : Oui, ma question est à peu près ce que serait cet appel/méthode POSIX.
6 votes
Vous pourriez bifurquer un enfant qui essaierait de
PTRACE_ATTACH
son parent (puis le détacher si nécessaire) et communique le résultat en retour. Cela semble cependant un peu inélégant.0 votes
@Huw : Cela a fonctionné, merci. Si vous écrivez une réponse, je l'accepterai. Mais la bifurcation rend la chose plutôt coûteuse.