Le programme à débuguer est exécuté à travers le débogueur et s'exécute normalement. Le débogueur offre alors au programmeur la possibilité de contrôler l'exécution du programme, en lui permettant par divers moyens de stopper (mettre en pause l'exécution du programme) et d'observer par exemple le contenu des différentes variables en mémoire. L'état d'exécution peut alors être observé afin, par exemple, de déterminer la cause d'une défaillance.
Quand l'exécution d'un programme est stoppée, le débogueur affiche la position courante d'exécution dans le code source original si celui-ci est un source-level debugger ou symbolic debugger. Si c'est un low-level debugger ou un machine-language debugger, il montre la ligne désassemblée.
De nombreux debogueurs permettent, en plus de l'observation de l'état des registres processeurs et de la mémoire, de les modifier avant de rendre la main au programme débogué. Ils peuvent alors être utilisés pour localiser certaines protections logicielles et les désactiver, amenant à la conception d'un crack. Ainsi, certains logiciels, connaissant le fonctionnement des débogueurs et voulant empêcher de telles modifications, mettent en place des techniques antidébogage (anti debugging tricks).