Debugging Kernel Tracker jcmdlp0106 Kernel Tracker 1 Objectif

  • Slides: 48
Download presentation
Debugging Kernel Tracker jc/md/lp-01/06 Kernel Tracker 1

Debugging Kernel Tracker jc/md/lp-01/06 Kernel Tracker 1

Objectif du chapitre • Écrire un programme multithread en mode debug • Explorer Kernel

Objectif du chapitre • Écrire un programme multithread en mode debug • Explorer Kernel Tracker, outils avancé de mise au point jc/md/lp-01/06 Kernel Tracker 2

DEBUG Main (1) #include "stdafx. h" DWORD WINAPI A_MAIN(LPVOID p); DWORD WINAPI B_MAIN(LPVOID p);

DEBUG Main (1) #include "stdafx. h" DWORD WINAPI A_MAIN(LPVOID p); DWORD WINAPI B_MAIN(LPVOID p); DWORD WINAPI FIN(LPVOID p); int WINAPI Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPTSTR lp. Cmd. Line, int n. Cmd. Show) jc/md/lp-01/06 Kernel Tracker 3

DEBUG Main (2) { DWORD dw. Exit. Code; //Déclaration et création des événements et

DEBUG Main (2) { DWORD dw. Exit. Code; //Déclaration et création des événements et des threads HANDLE h. Event_A=Create. Event(NULL, TRUE, FALSE, L"EVENT_A"); HANDLE h. Event_B=Create. Event(NULL, TRUE, FALSE, L"EVENT_B"); HANDLE h. Event_fin=Create. Event(NULL, TRUE, FALSE, NULL); HANDLE h. Thread_Fin=Create. Thread(0, 0, FIN, &h. Event_fin, 0, 0); HANDLE h. Thread_A=Create. Thread(0, 0, A_MAIN, &h. Thread_Fin, 0, 0); HANDLE h. Thread_B=Create. Thread(0, 0, B_MAIN, &h. Thread_Fin, 0, 0); jc/md/lp-01/06 Kernel Tracker 4

DEBUG Main (3) //Impression des handles pour identifier les objets dans Kernel Tracker RETAILMSG(1,

DEBUG Main (3) //Impression des handles pour identifier les objets dans Kernel Tracker RETAILMSG(1, (TEXT("MAIN: h. Thread_A= %xn"), h. Thread_A)); RETAILMSG(1, (TEXT("MAIN: h. Thread_B= %xn"), h. Thread_B)); RETAILMSG(1, (TEXT("MAIN: h. Thread_Fin= %xn"), h. Thread_Fin)); RETAILMSG(1, (TEXT("MAIN: h. Event_A= %xn"), h. Event_A)); RETAILMSG(1, (TEXT("MAIN: h. Event_B= %xn"), h. Event_B)); RETAILMSG(1, (TEXT("MAIN: h. Event_fin= %xn"), h. Event_fin)); //Déclenchement de l’événement A Set. Event(h. Event_A); jc/md/lp-01/06 Kernel Tracker 5

DEBUG Main (4) //Attente du signal de fin puis de la fin… de A

DEBUG Main (4) //Attente du signal de fin puis de la fin… de A et de B Wait. For. Single. Object(h. Event_fin, INFINITE); //Attente…fin while(Get. Exit. Code. Thread(h. Thread_A, &dw. Exit. Code), dw. Exit. Code == STILL_ACTIVE) Sleep(0); //…tant que thread A… pas fini while(Get. Exit. Code. Thread(h. Thread_B, &dw. Exit. Code), dw. Exit. Code == STILL_ACTIVE) Sleep(0); //…tant que thread B… pas fini jc/md/lp-01/06 Kernel Tracker 6

DEBUG Main (5) //Fermeture de tous les handles créés Close. Handle(h. Thread_A); Close. Handle(h.

DEBUG Main (5) //Fermeture de tous les handles créés Close. Handle(h. Thread_A); Close. Handle(h. Thread_B); Close. Handle(h. Thread_Fin); Close. Handle(h. Event_A); Close. Handle(h. Event_B); Close. Handle(h. Event_fin); RETAILMSG(1, (TEXT("MAIN: fin de DEBUGn"))); return 0; } jc/md/lp-01/06 Kernel Tracker 7

DEBUG Thread_A (1) DWORD WINAPI A_MAIN(LPVOID p) { //p est un pointeur sur le

DEBUG Thread_A (1) DWORD WINAPI A_MAIN(LPVOID p) { //p est un pointeur sur le handle du thread FIN DWORD dw. Exit. Code, i, j=0; //Récupération des handles des événements A et B HANDLE h. EVENT_A=Open. Event( EVENT_ALL_ACCESS, FALSE, L"EVENT_A"); HANDLE h. EVENT_B=Open. Event( EVENT_ALL_ACCESS, FALSE, L"EVENT_B"); jc/md/lp-01/06 Kernel Tracker 8

DEBUG Thread_A (2) while(Get. Exit. Code. Thread(*(PHANDLE)p, &dw. Exit. Code), dw. Exit. Code ==

DEBUG Thread_A (2) while(Get. Exit. Code. Thread(*(PHANDLE)p, &dw. Exit. Code), dw. Exit. Code == STILL_ACTIVE) { Wait. For. Single. Object(h. EVENT_A, INFINITE); //attente… RETAILMSG(1, (TEXT("A_MAIN: j= %dn"), ++j)); for(i=0; i<1000000; i++) //histoire de passer le temps… ; //sans sortir du thread Reset. Event(h. EVENT_A); //réinitialisation de…A Set. Event(h. EVENT_B); //Déclenchement de…B } return 'A'; } jc/md/lp-01/06 Kernel Tracker 9

DEBUG Thread_B (1) DWORD WINAPI B_MAIN(LPVOID p) { //p est un pointeur sur le

DEBUG Thread_B (1) DWORD WINAPI B_MAIN(LPVOID p) { //p est un pointeur sur le handle du thread FIN DWORD dw. Exit. Code, i, j=0; //Récupération des handles des événements A et B HANDLE h. EVENT_A=Open. Event( EVENT_ALL_ACCESS, FALSE, L"EVENT_A"); HANDLE h. EVENT_B=Open. Event( EVENT_ALL_ACCESS, FALSE, L"EVENT_B"); jc/md/lp-01/06 Kernel Tracker 10

DEBUG Thread_B (2) while(Get. Exit. Code. Thread(*(PHANDLE)p, &dw. Exit. Code), dw. Exit. Code ==

DEBUG Thread_B (2) while(Get. Exit. Code. Thread(*(PHANDLE)p, &dw. Exit. Code), dw. Exit. Code == STILL_ACTIVE) { Wait. For. Single. Object(h. EVENT_B, INFINITE); RETAILMSG(1, (TEXT("B_MAIN: j= %dn"), ++j)); Reset. Event(h. EVENT_B); //réinitialisation de B… for(i=0; i<1000000; i++) //histoire de passer le temps. . . ; //sans sortir du thread Set. Event(h. EVENT_A); //Déclenchement de A } return 'B'; } jc/md/lp-01/06 Kernel Tracker 11

DEBUG Thread_FIN DWORD WINAPI FIN(LPVOID p) { //p pointeur sur le handle de l’événement

DEBUG Thread_FIN DWORD WINAPI FIN(LPVOID p) { //p pointeur sur le handle de l’événement fin Message. Box(NULL, _T("OK pour terminer"), _T("DEBUG"), MB_OK); return (DWORD)Set. Event(*(PHANDLE)p); } jc/md/lp-01/06 Kernel Tracker 12

Exécution de DEBUG • Générer DEBUG • Télécharger l’image (version Debug) • Exécuter DEBUG

Exécution de DEBUG • Générer DEBUG • Télécharger l’image (version Debug) • Exécuter DEBUG pour vérifier son bon fonctionnement • Fermer l’application • Fermer la fenêtre cible • Nous allons étudier cette application avec l’outil « Remote Kernel Tracker » proposé avec Platform Builder jc/md/lp-01/06 Kernel Tracker 13

Options de Build version Debug jc/md/lp-01/06 Kernel Tracker 14

Options de Build version Debug jc/md/lp-01/06 Kernel Tracker 14

Variante • Sous « Kernel Tracker » beaucoup d’événements dus à l’existence des messages

Variante • Sous « Kernel Tracker » beaucoup d’événements dus à l’existence des messages seront créés par le système. • La suppression des messages « RETAIL » dans les threads A ou B, et le remplacement de la boîte de dialogue par une boucle vide dans le thread FIN simplifient les diagrammes observés, mais cela masque les interactions du programme avec le système et avec « Kernel Tracker » lui-même. jc/md/lp-01/06 Kernel Tracker 15

Outils de Platform Builder • Platform Builder propose un ensemble d’outils spécialisés et un

Outils de Platform Builder • Platform Builder propose un ensemble d’outils spécialisés et un générateur de macro pour aider à la mise au point d’applications, vérifier le bon fonctionnement temporel, étudier les performances, visualiser les fenêtres, etc. • Parmi ces outils, le « Remote Kernel Tracker » permet de visualiser graphiquement la chronologie d’une application : création des process, threads, événements, enchaînement des événements, mutex, etc. jc/md/lp-01/06 Kernel Tracker 16

Découverte de Kernel Tracker • • Téléchargement du noyau Lancement de Remote Kernel Tracker

Découverte de Kernel Tracker • • Téléchargement du noyau Lancement de Remote Kernel Tracker Lancement de DEBUG Collecte des données – – Attente de quelques secondes Fin de DEBUG après click sur OK Fin de la collecte après quelques secondes Déconnexion de la cible • Analyse des données jc/md/lp-01/06 Kernel Tracker 17

Démarrage de Remote Kernel Tracker jc/md/lp-01/06 Kernel Tracker 18

Démarrage de Remote Kernel Tracker jc/md/lp-01/06 Kernel Tracker 18

Accepter le choix par défaut : OK jc/md/lp-01/06 Kernel Tracker 19

Accepter le choix par défaut : OK jc/md/lp-01/06 Kernel Tracker 19

Début de Remote Kernel Tracker jc/md/lp-01/06 Kernel Tracker 20

Début de Remote Kernel Tracker jc/md/lp-01/06 Kernel Tracker 20

Après démarrage de DEBUG jc/md/lp-01/06 Kernel Tracker 21

Après démarrage de DEBUG jc/md/lp-01/06 Kernel Tracker 21

À la fin de DEBUG jc/md/lp-01/06 Kernel Tracker 22

À la fin de DEBUG jc/md/lp-01/06 Kernel Tracker 22

Suppression de Auto-Follow Mode jc/md/lp-01/06 Kernel Tracker 23

Suppression de Auto-Follow Mode jc/md/lp-01/06 Kernel Tracker 23

Déconnexion de la cible jc/md/lp-01/06 Kernel Tracker 24

Déconnexion de la cible jc/md/lp-01/06 Kernel Tracker 24

Analyse des données • Récupération des valeurs des handles dans DEBUG pour identifier les

Analyse des données • Récupération des valeurs des handles dans DEBUG pour identifier les traces • Étude de diverses phases – – – Début de DEBUG Lancement des threads A, B et FIN Positionnement de l’événement A Fonctionnement alternatif de A et B Thread en attente Fin de DEBUG • Mesure des temps jc/md/lp-01/06 Kernel Tracker 25

Récupération des handles jc/md/lp-01/06 Kernel Tracker 26

Récupération des handles jc/md/lp-01/06 Kernel Tracker 26

Valeur des handles dans DEBUG • • Process. ID : Thread. ID : h.

Valeur des handles dans DEBUG • • Process. ID : Thread. ID : h. Thread_A : h. Thread_B : h. Thread_Fin : h. Event_A : h. Event_B : h. Event_Fin : jc/md/lp-01/06 0 x 63 D 9 CF 8 A 0 x 63 D 1013 A 0 x 03 D 97 A 3 A 0 x 03 CECFA 2 0 x 03 DB 1512 0 x 03 D 979 DA 0 x 03 DB 1152 0 x 03 DB 140 A Kernel Tracker 27

Phase de démarrage de DEBUG Prologue FIN A B jc/md/lp-01/06 Kernel Tracker 28

Phase de démarrage de DEBUG Prologue FIN A B jc/md/lp-01/06 Kernel Tracker 28

Positionnement du curseur par un click gauche jc/md/lp-01/06 Kernel Tracker 29

Positionnement du curseur par un click gauche jc/md/lp-01/06 Kernel Tracker 29

Positionnement du marqueur 1 Ouverture du menu par click droit jc/md/lp-01/06 Kernel Tracker 30

Positionnement du marqueur 1 Ouverture du menu par click droit jc/md/lp-01/06 Kernel Tracker 30

Positionnement du marqueur 2 Curseur déplacé Marqueur 1 positionné jc/md/lp-01/06 Kernel Tracker 31

Positionnement du marqueur 2 Curseur déplacé Marqueur 1 positionné jc/md/lp-01/06 Kernel Tracker 31

Mesure du temps entre marqueurs Écart visualisé par une hachure Écart mesuré numériquement jc/md/lp-01/06

Mesure du temps entre marqueurs Écart visualisé par une hachure Écart mesuré numériquement jc/md/lp-01/06 Kernel Tracker 32

Action directe sur les marqueurs Ouverture du menu par click droit dans la bande

Action directe sur les marqueurs Ouverture du menu par click droit dans la bande d’affichage des temps jc/md/lp-01/06 Kernel Tracker Dans ce cas le marqueur sera placé à l’endroit du click droit 33

Action directe sur les threads Ouverture du menu par click droit sur le nom

Action directe sur les threads Ouverture du menu par click droit sur le nom du thread jc/md/lp-01/06 Kernel Tracker 34

Fonctionnement des threads A et B Déblocage de A A reprend A attend B

Fonctionnement des threads A et B Déblocage de A A reprend A attend B reprend B attend jc/md/lp-01/06 Kernel Tracker 35

Détail de la mise en attente de B Déblocage de A Set. Event A

Détail de la mise en attente de B Déblocage de A Set. Event A jc/md/lp-01/06 Attente sur B Wait. For. Single. Object B Kernel Tracker 36

Détail de la réactivation de A Le système a posé une section critique Inversion

Détail de la réactivation de A Le système a posé une section critique Inversion de priorité A reprend avec sa priorité normale (251) A revient à sa priorité normale (251) A est à la priorité 130 jc/md/lp-01/06 Kernel Tracker 37

Détail de la mise en attente de A Blocage de A Reset. Event A

Détail de la mise en attente de A Blocage de A Reset. Event A Déblocage de B Set. Event B A dans sa boucle vide Attente de A Wait. For. Single. Object A jc/md/lp-01/06 Kernel Tracker 38

Détail de la réactivation de B B reprend Reset. Event B jc/md/lp-01/06 B dans

Détail de la réactivation de B B reprend Reset. Event B jc/md/lp-01/06 B dans sa boucle vide Kernel Tracker 39

Attente dans FIN de « OK » FIN est élu B est élu Le

Attente dans FIN de « OK » FIN est élu B est élu Le système ferme une section critique nécessaire pour gérer la boîte de dialogue jc/md/lp-01/06 Le système ouvre une section critique nécessaire pour gérer la boîte de dialogue Kernel Tracker 40

Réception « OK » et fin du thread B Message « OK » arrivé

Réception « OK » et fin du thread B Message « OK » arrivé Fin du thread B MAIN trouve B fini et entre dans le premier Sleep Suspension du thread B Épilogue de B jc/md/lp-01/06 Kernel Tracker 41

Détail de la fin du thread B B trouve le thread FIN inactif et

Détail de la fin du thread B B trouve le thread FIN inactif et sort B dans la boucle vide jc/md/lp-01/06 Set. Event A Épilogue Kernel Tracker 42

Fin du thread A Épilogue de A jc/md/lp-01/06 Suspension du thread A Kernel Tracker

Fin du thread A Épilogue de A jc/md/lp-01/06 Suspension du thread A Kernel Tracker 43

Détail de la fin du thread A Reset. Event A A dans la boucle

Détail de la fin du thread A Reset. Event A A dans la boucle vide Set. Event B A trouve le thread FIN inactif et sort Épilogue de A jc/md/lp-01/06 Kernel Tracker 44

Fermeture des événements Close. Event A, Close. Event B Close. Event FIN jc/md/lp-01/06 Kernel

Fermeture des événements Close. Event A, Close. Event B Close. Event FIN jc/md/lp-01/06 Kernel Tracker Suppression de EVENT_FIN 45

Fin du thread FIN Fin de DEBUG Suspension du thread FIN jc/md/lp-01/06 Épilogue de

Fin du thread FIN Fin de DEBUG Suspension du thread FIN jc/md/lp-01/06 Épilogue de DEBUG Kernel Tracker 46

Fin du process Threads suspendus ou en sommeil jc/md/lp-01/06 Épilogue du process Kernel Tracker

Fin du process Threads suspendus ou en sommeil jc/md/lp-01/06 Épilogue du process Kernel Tracker Suspension de DEBUG 47

Conclusion • Nous avons exploré différents aspects Kernel Tracker – Visualisation de l’enchaînement des

Conclusion • Nous avons exploré différents aspects Kernel Tracker – Visualisation de l’enchaînement des taches – Mesure des temps – Utilisation en tant qu’analyseur logique jc/md/lp-01/06 Kernel Tracker 48