Je travaille sur un projet, où j'ai besoin d'obtenir une pile native de l'application Java. Je suis capable d'y parvenir partiellement. grâce à ptrace/multiprocessing et aux signaux.Multithreading, Multiprocessing avec STOP et Continue Signaux
sous Linux l'application Java normale a un nombre minimum de 14 threads. sur ces 14 je suis intéressé par le fil principal dont je dois obtenir la pile natif. compte tenu de cet objectif j'ai commencé un processus séparé en utilisant fork() qui surveille la pile native du thread principal. En bref, j'ai 2 processus séparés: l'un est surveillé et l'autre fait la surveillance en utilisant ptrace et la gestion des signaux.
étapes dans le processus de suivi:
1) obtenir thread principal-id de l'autre 14 fil du processus.
2) ptrace_attach main_ID
3) PTRACE_CONT main_ID
boucle continue commence
{
4) tuer (main_ID, SIGSTOP),
5) nanosleep et vérifier l'état à partir de/proc/[p id]/stat dir
6) PTRACE_PEEKDATA pour lire la pile et de naviguer
7) PTRACE_CONT main_ID
8) nanosleep et vérifier l'état de la/proc/[pid]/stat dir
}
9) PTRACE_DETACH main_ID
cela donne parfaitement la pile native i informations en continu. mais parfois je fais face à un problème.
La question:
quand j'envoie tuer (main_ID, SIGSTOP) pour fil conducteur, les autres threads du processus obtenir dans l'état fini ou stoped (T) et les blocs entiers de processus. ce n'est pas le comportement de consistance et tout le processus s'exécute correctement. Je ne pouvais pas comprendre ce comportement car je ne fais que signaler le thread principal, pourquoi d'autres threads en sont affectés? Est-ce que quelqu'un pourrait m'aider à analyser le problème? J'ai également essayé de faire des signaux CONT et STOP sur tous les threads du processus, mais le problème persiste parfois.
Merci, Sandeep
d'après ce que j'ai compris jusqu'à présent. –
il y a un gestionnaire de signal par défaut correspondant au signal au niveau du processus. lorsque le processus trouve un signal pour l'un quelconque de ses fils enfants, le signal respectif est traité par l'un quelconque du fil en fonction de l'état, c'est-à-dire occupé ou libre. cela pourrait être la raison des résultats incohérents pour moi. –