Depurador
![](http://upload.wikimedia.org/wikipedia/commons/thumb/8/80/GDB_Screenshot.png/220px-GDB_Screenshot.png)
Un depurador (en anglès, debugger ), és un programa que permet depurar o netejar els errors d'un altre programa informàtic. El codi a ser examinat pot alternativament estar executant-se en un simulador de conjunt d'instruccions (ISS), una tècnica que permet una gran potència en la seva capacitat de detenir-se quan són oposades condicions específiques però serà típicament una mica més lent que executant el codi directament en el processador adequat. Alguns depuradors ofereixen dues maneres d'operació - la simulació parcial o completa, per limitar aquest impacte.
Si és un depurador de nivell de font o depurador simbòlic, comunament ara vist en entorns de desenvolupament integrats, quan el programa "peta" o aconsegueix una condició predefinida, la depuració típicament mostra la posició en el codi original. Si és un depurador de baix nivell o un depurador de llenguatge de màquina, mostra la línia en el font desassemblat (tret que també tingui accés en línia al codi font original i pugui exhibir la secció apropiada del codi de l'assemblador o del compilador). Una "petada" succeeix quan el programa no pot continuar normalment a causa d'un error de programació. Per exemple, el programa va poder haver intentat usar una instrucció no disponible en la versió actual del CPU o haver intentat tenir accés a memòria protegida o no disponible.
Típicament, els depuradors també ofereixen funcions més sofisticades com executar un programa pas a pas (un pas o animació del programa), parar el programa (breacking), és a dir, pausar el programa per examinar l'estat actual en cert esdeveniment o instrucció especificada per mitjà d'un breakpoint, i el seguiment de valors d'algunes variables. Alguns depuradors tenen la capacitat de modificar l'estat del programa mentre que s'està executant, en comptes de simplement observar-lo. També és possible continuar l'execució en una posició diferent al programa a través d'un bypass en una petada o error lògic.
La importància d'un bon depurador no pot ser exagerada. De fet, l'existència i la qualitat de tal eina per a un llenguatge i una plataforma donades sovint pot ser el factor de decisió en el seu ús, fins i tot si un altre llenguatge/plataforma és més adequat per a la tasca. L'absència d'un depurador, una vegada estant acostumat a usar-ne, s'ha dit que "fa que vostè se senti com un home cec en una cambra fosca buscant un gat negre que no està allí".[1] No obstant això, el programari pot (i sovint) es comporta diferent executant-se sota un depurador que normalment, a causa dels canvis inevitables que la presència d'un depurador farà a la temporització interna d'un programari. Com a resultat, fins i tot amb una bona eina de depuració, és sovint molt difícil rastrejar problemes de temps d'execució en complexos sistemes distribuïts amb múltiples fils.
La mateixa funcionalitat que fa a un depurador útil per eliminar errors permet ser usat com a eina de craqueig de programari per evadir la protecció anticòpia, la gestió digital de drets, i altres característiques de protecció de programari. Sovint també és útil com a eina general de verificació de proves, cobertura d'errors, o analitzador de rendiment, especialment si són mostrades les longituds de trajectòria d'instrucció.
La majoria dels motors de depuració actuals, com el gdb i dbx proporcionen interfícies basades en línia d'ordres. Els frontals de depuració són extensions populars als motors de depuració, que proporcionen integració a l'IDE, animació del programa, i característiques de visualització. Alguns depuradors dels primers mainframes com l'Oliver i el SIMON van proporcionar aquesta mateixa funcionalitat per l'IBM System/360 i posteriors sistemes operatius, fins als anys 1970.
Dependència del llenguatge
[modifica]Alguns depuradors operen en un simple llenguatge específic mentre que d'altres poden manejar múltiples llenguatges transparentement. Per exemple si el programa objectiu principal és escrit en COBOL, però realitza crides a subrutines en assemblador i també subrutines en PL/1, el depurador pot canviar maneres dinàmicament per acomodar els canvis en el llenguatge a mesura que s'executen.
Protecció de memòria
[modifica]Alguns depuradors també incorporen protecció de memòria per evitar violacions de l'emmagatzematge com el desbordament de búfer. Això pot ser extremadament important en els ambients de processament de transaccions on la memòria és dinàmicament assignada des de "pools" de memòria en una base de tasca per tasca.
Suport de maquinari per a la depuració
[modifica]La majoria dels microprocessadors moderns tenen almenys una d'aquestes característiques en el seu disseny de CPU per fer la depuració més fàcil:
- Suport en maquinari per executar un programa pas a pas, com el trap flag.
- Un conjunt d'instruccions conformat amb els requeriments de virtualització de Popek i Goldberg, fa més fàcil escriure el programari de depuració que s'executa en el mateix CPU que el programari que està sent depurat; la CPU pot executar els bucles interns del programa sota prova a velocitat completa, i encara romandre sota control del depurador.
- In-system programming (ISP) (programació en sistema) permet a un depurador de maquinari extern reprogramar un sistema sota prova, per exemple, addició o eliminació d'instruccions de punts de ruptura (breakpoints). Molts sistemes amb tal suport d'ISP també tenen un altre suport de maquinari de depuració.
- Suport de maquinari per breakpoints de codi i dades, tals com a comparadors d'adreces i comparadors de valors de dades, o amb considerablement més treball implicat, maquinari d'error de pàgina.
- L'accés de JTAG a les interfícies de depuració de maquinari com en processadors de l'arquitectura ARM o usant el conjunt d'ordres Nexus. Els processadors usats en sistemes incrustats típicament tenen extens suport de depuració JTAG.
- Els microcontroladors amb només sis pins necessiten utilitzar substituts de baix recompte de pins per JTAG, com BDM, Spy-Bi-Wire, o DebugWire en el Atmel AVR. DebugWire, per exemple, usa senyalització bidireccional en el pin del RESET.
Ús
[modifica]En iniciar la depuració, el depurador llança el programa a depurar. Aquest s'executa normalment fins que el depurador atura la seva execució, permetent a l'usuari examinar la situació.
El depurador permet aturar el programa a:
- Un punt determinat mitjançant un punt de ruptura.
- Un punt determinat sota certes condicions mitjançant un punt de ruptura condicional.
- Un moment determinat que es compleixin certes condicions.
- Un moment determinat a petició de l'usuari.
Durant aquesta interrupció, l'usuari pot:
- Examinar i modificar la memòria i les variables del programa.
- Examinar el contingut dels registres del processador.
- Examinar la pila de crides que han desembocat en la situació actual.
- Canviar el punt d'execució, de manera que el programa continuï la seva execució en un punt diferent al punt en què va ser detingut.
- Executar instrucció a instrucció.
- Executar parts determinades del codi, com l'interior d'una funció, o la resta de codi abans de sortir d'una funció.
El depurador depèn de l'arquitectura i sistema en què s'executi, per la qual cosa les seves funcionalitats canvien d'un sistema a un altre. Aquí s'han mostrat les més comunes.
Informació de depuració
[modifica]![](http://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Winpdb-1.3.6.png/220px-Winpdb-1.3.6.png)
Per poder aprofitar totes les possibilitats de depuració és necessari que, al compilar el programa a depurar, s'indiqui al compilador que ha d'incloure instruccions i informació extra per a la depuració del codi. Aquesta informació extra consisteix bàsicament en la correspondència entre les instruccions del codi executable i les instruccions del codi font que les originen, així com informació sobre noms de variables i funcions.
Tot i que si no s'inclou aquesta informació de depuració, segueix sent possible monitorar l'execució del programa. No obstant això, resultarà més difícil i complexa degut a aquesta manca d'informació del context en què s'executa el programa.
Altres usos
[modifica]Un depurador també pot usar-se per realitzar enginyeria inversa o evitar proteccions de còpia. Mitjançant l'ús del depurador es pot conèixer el funcionament intern del programa examinat, ajudant al procés d'enginyeria inversa o permetent desenvolupar tècniques per evadir les restriccions imposades pel programa.
Efectes secundaris
[modifica]És important supervisar que un programa que està sent depurat pot presentar un comportament diferent a si s'executa en solitari pel fet que el depurador canvia lleugerament els temps interns del programa. Aquests canvis en els temps d'execució afecten especialment a sistemes complexos multihebra o sistemes distribuïts.
Exemples de depuradores
[modifica]Alguns depuradors utilitzats són:
- GNU Debugger (gdb)
- SoftICE
- OllyDbg
- Trw2000
- Anada Pro
- Intel Debugger (IDB)
- LLDB
- Microsoft Visual Studio Debugger
- Valgrind
Vegeu també
[modifica]Referències
[modifica]- Jonathan B. Rosenberg, How Debuggers Work: Algorithms, Data Structures, and Architecture, John Wiley & Sons, ISBN 0-471-14966-7