DOUG LLOYD: Molt bé GDB. Què és exactament? Així GDB, que significa per al depurador de GNU, és una eina molt impressionant que podem utilitzar per ajudar-nos a depurar nostres programes, o esbrinar on són les coses que va malament en els nostres programes. BGF és increïblement poderosa, però la sortida i la interacció amb ella pot ser una mica críptic. En general és una eina de línia d'ordres, i pot llançar una gran quantitat de missatges a vostè. I pot una mica difícil analitzar exactament el que està passant. Passos Afortunadament, ens hem pres per solucionar aquest problema per a vostè a mesura que treballa a través CS50. Si vostè no està utilitzant la gràfica depurador, que la meva col·lega Dan Armandarse ha parlat bastant una mica sobre un vídeo que ha de ser per aquí en aquest moment, és possible que necessiti utilitzar aquests línia d'ordres eines per treballar amb GDB. Si està treballant en el CS50 IDE, no cal fer això. Però si no estàs treballant en el CS50 IDE, potser utilitzant una versió de CS50 Appliance, o un altre operatiu Linux sistema amb GDB instal·lat en ell, pot ser que hagi d'utilitzar aquestes eines de línia d'ordres. I ja que vostè podria té a veure això, és útil només per entendre com GDB funciona des de la línia d'ordres. Però, de nou, si vostè és utilitzant l'IDE CS50, que pot utilitzar el depurador gràfic que està integrat a l'IDE. Així que perquè funcioni amb GDB, per iniciar la depuració d'un procés particular, programa, tot el que heu de fer s'escrigui GDB seguit pel nom del programa. Així, per exemple, si el seu programa és hola, escriuria GDB hola. Quan fas això, vas per aixecar l'entorn GDB. La seva ràpida canviarà, i en lloc de ser el que en general és quan s'escriu coses en ls line-- comando, cd-- tota la seva típica Comandaments de Linux, l'indicador canviarà a, probablement, alguna cosa com parèntesi GDB parèntesis. Aquest és el teu nou indicador GDB, perquè estàs dins l'entorn del BGF. Un cop dins d'aquest entorn, hi ha dos principals ordres que és probable que utilitzi en el següent ordre. La primera és b, que és l'abreviatura de descans. I després d'escriure b, normalment escriviu el nom d'una funció, o si per casualitat vostè coneix tot el que el número de línia el programa està començant a comportar una mica estrany, pot escriure una línia nombre d'allà també. El que b, o ruptura, fa és que li permet al seu programa per funcionar fins a un cert punt, a saber, el nom de la funció que especifiqui o la línia nombre que especifiqueu. I en aquest punt, congelarà execució. Aquesta és una molt bona cosa, perquè una vegada que l'execució s'ha congelat, vostè pot començar a molt lentament pas a través del seu programa. Normalment, si has estat corrent seus programes, que són bastant curt. En general, s'escriu slash dot el el nom del seu programa, premeu Enter, i abans que pugui parpellejar, la seva programa ja ha acabat. En realitat no és un munt de temps per provar i esbrinar el que està passant malament. Així que realment sigui capaç de frenar les coses per l'establiment d'un punt de ruptura amb b, i després intervenir. Després, una vegada que hagi definit la seva ruptura punt, vostè pot executar el programa. I si vostè té qualsevol arguments de la línia d'ordres, especificats aquí, no quan escriu GDB seu nom del programa. S'especifica tota la línia d'ordres arguments prenent r, o córrer, i després els arguments de línia de comandes que sigui que necessita dins del seu programa. Hi ha un nombre d'altres realment ordres importants i útils dins de l'ambient del PIB. Així que permetin-me ràpidament repassar alguns d'ells. El primer és N, que és l'abreviatura per al pròxim, i vostè pot escriure al costat en lloc de n, tant funcionaria. I és només la taquigrafia. I com vostè probablement ja haurà arribat utilitzat per a, de ser capaç d'escriure coses més curt és generalment millor. I el que va a fer és que va a un pas endavant d'un bloc de codi. Així que seguirà endavant fins que una trucada a la funció. I llavors en lloc de capbussar-se en aquesta funció i passant per tots que les funcions codi, només tindrà la funció. La funció serà cridada. Es farà tant la seva tasca és. Es retornarà un valor de la funció que la va cridar. I llavors podràs passar a la següent línia d'aquesta funció que crida. Si vols fer un pas dins de la funció, en lloc de només tenir s'executa, especialment si vostè pensa que el problema podria estar dins d'aquesta funció, vostè podria, per descomptat, establir un trencament punt dins d'aquesta funció. O si ja s'està executant, pot utilitzi s per avançar una línia de codi. Així que això va a intervenir i submergir-se en funcions, en lloc de només tenir la execute i continuant en la funció de que vostè es trobarà amb la depuració. Si alguna vegada vols saber el valor d'una variable, pot escriure p, o impressió, i després el nom de la variable. I això va a imprimir a vostè, dins l'entorn del BGF, el nom de la variable, que usted-- excusar mi-- el valor de la variable que vostè ha nomenat. Si desitja conèixer els valors de tots els variable local accessible des d'on es troba actualment en la seva programa, pot escriure informació vilatans. És molt més ràpid que teclejant p i després el que sigui, llista a terme totes les les variables que sap que existeixen. Pot escriure informació locals, i imprimirà tot per a vostè. El següent és bt, que és abreviatura de Tornar Trace. Ara, en general, especialment d'hora en CS50, no realment tindrà ocasió utilitzar bt, o Back Trace, perquè no està tenint funcions que criden a altres funcions. És possible que tingui una trucada principal funció, però això és probablement la mateixa. No ha de altra funció trucar a una altra funció, que crida a una altra funció, i així successivament. Però a mesura que els programes es tornen més complexa, i en particular quan es comença a treballar amb recursivitat, rastreig pot ser una manera molt útil per permetre- tipus d'aconseguir una mica de context per on Jo estic en el meu programa. Així que dius que has escrit el codi, i vostè sap que la principal crida a una funció f, que crida a una funció g, que crida a una funció h. Així que tenim diverses capes d'implantació passa aquí. Si estàs dins de el seu entorn de GDB, i vostè sap que el seu interior de h, però s'oblida sobre el que va arribar a on tracti: pot escriure bt o rastreig, i s'imprimirà h, g, f principal, juntament amb alguna altra informació, que et dóna una pista que, OK principal anomenat f, f anomenat g, g crida h, i aquí és on jo Actualment estic en el meu programa. Així que pot ser realment útil, sobretot perquè el críptic-tat de GDB es converteix en una mica aclaparadora, a saber exactament on són les coses. Finalment, quan es porta a terme el programa, o quan hagi acabat depurar- i vol allunyar- des de l'entorn de GDB, ajuda a saber com sortir-ne. Pot escriure q, o Sortir, sortir. Ara, abans de vídeo d'avui Vaig preparar un programa amb errors anomenada buggy1, que compili des d'un arxiu conegut com buggy1.c. Com era d'esperar, aquest programa és, de fet, amb errors. Alguna cosa va malament quan intento executar-lo. Ara, per desgràcia, sense adonar-me eliminat el meu arxiu buggy1.c, així que per a mi esbrinar ¿Què està passant malament amb aquest programa, Vaig a haver d'usar GDB tipus de cegues, tractant per navegar a través d'aquest programa per esbrinar exactament el que va malament. Però usant només les eines que ja hem après sobre, podem més o menys la figura exactament el que és. Així que anem a CS50 IDE i fer una ullada. OK, així que estem aquí al meu CS50 entorn IDE, i vaig a zoom en una mica perquè pugui veure una mica més. A la finestra de la meva terminal, si enumero el contingut del meu actual director amb ls, veurem que tenir un parell d'arxius de codi font aquí, incloent el buggy1 discutit prèviament. El que passa exactament quan Tracte de córrer buggy1. Bé anem a esbrinar. Escric barra de punt, amb errors, i em van colpejar Retorn. Errors de segmentació. Això no és bo. Si vostè recorda, un fallada de segmentació normalment passa quan s'accedeix a la memòria que no se'ns permet tocar. Hem arribat d'alguna manera fora dels límits del que el programa, el compilador, ens ha donat. I així, ja que és una clau a tenir a la caixa d'eines en començar el procés de depuració. Alguna cosa ha anat una mica malament aquí. Molt bé, així que començarem l'entorn de GDB i veure si podem esbrinar ¿Què és exactament el problema. Vaig a netejar la meva pantalla, i jo vaig a escriure BGF de nou, per entrar a l'entorn del BGF, i el nom del programa que vull depurar, buggy1. Tenim un petit missatge, llegint símbols de buggy1, fer. Tot el que significa és que va treure junts tot el codi, i ara que ha estat carregat en GDB, i està llest per anar. Ara, què és el que vull fer? ¿Recorda el que el primera etapa és típicament després que jo estic dins d'aquest ambient? Esperem que aquest conjunt un punt d'inflexió, perquè de fet, això és el que vull fer. Ara, jo no tinc la codi font d'aquest davant meu, que és, probablement, no és el cas d'ús típic, per cert. Vostè probablement ho farà. Així que això és bo. Però suposant que no, el que és la funció que vostè sap existeix en cada programa de C sola? No importa com de gran o complicat que és, aquesta funció sense dubte existeix. Principal, ¿no? Així que tota la resta si no, que pot establir un punt d'inflexió en el principal. I de nou, jo només vaig poder escriure trencar principal, en lloc de b. I si vostè és curiós, si mai escrigui un comando llarg i després adonar-se que escrit les coses malament, i vol desfer- tot el que acabo de fer, vostè pot controlar O, que va esborrar tot i portar de tornada al principi de les línies de cursor. Molt més ràpid que simplement premeu la eliminar o colpejant de vegades manat acabat. Així que anem a establir un punt d'inflexió en el principal. I com es pot veure, es diu que hem establir un punt d'inflexió en l'arxiu buggy1.c, i pel que sembla la primera línia del codi del principal és la línia de set. Un cop més, no tenim l'arxiu d'origen aquí, però vaig a suposar que es tracta d' dir-me la veritat. I llavors, només estic tractant i executar el programa, r. A partir del programa. Molt bé, de manera que aquest missatge és una mica críptic. Però bàsicament el que hi ha passant aquí és que és només dient-me que he colpejat el meu descans punt, trencar el punt número 1. I després, aquesta línia de codi, el fitxer o directori no existeix. L'única raó per la qual Estic veient aquest missatge és perquè sense adonar-me eliminat el meu arxiu buggy.c. Si existia meu arxiu buggy1.c en el directori actual, aquest dret línia hi ha realment faria digues-me el que la línia de codi literalment llegeix. Per desgràcia, jo vaig esborrar. Haurem de tipus de navegar a través d'aquest una mica més a cegues. OK, així que anem a veure, què Què vull fer aquí? Bé, m'agradaria saber què locals variables que potser estan disponibles per a mi. He començat el meu programa. Anem a veure el que podria ser ja inicialitzat per a nosaltres. Escric Info vilatans, no hi ha gent. Molt bé, així que no ho fa em dóna un munt d'informació. Jo podria tractar d'imprimir una variable, però jo no conec cap nom de les variables. Podria intentar un rastreig, però jo estic dins de la principal, així que sé que no he fet una altra crida a la funció en aquest moment. Així que sembla que les meves úniques opcions són utilitzar n o així i començar a bussejar en. Vaig a utilitzar n. Així que escric n. Oh, Déu meu, ¿què està passant aquí. Programa de les senyals rebudes, SIGSEGV error de segmentació, i després un munt de coses. Ja estic aclaparat. Bé, en realitat hi ha una molt per aprendre aquí. Llavors, què ens diu això? El que ens diu és que aquest programa és a punt, però no té, però, culpa seg. I en particular, vaig per apropar encara més aquí, està a punt de SEG culpa sobre una cosa anomenada strcmp. Ara, pot ser que no hàgim discutit aquesta funció extensivament. Però és-- perquè no anem per parlar de totes les funcions que existeix en l'estàndard C library-- però tots estan disponibles per a vostè, sobretot si es pren un mira reference.cs50.net. I strcmp és un molt potent funció que existeix a l'interior de la capçalera string.h arxiu, que és una capçalera arxiu que es dedica a funcions que treballen amb i manipular cadenes. I, en particular, el que fa és strcmp compara els valors de dues cadenes. Així que estic a punt de segmentació culpa en una crida a strcmp sembla. Vaig colpejar n, i de fet em surt el missatge, programa va acabar amb SIGSEGV de senyal fallada de segmentació. Així que ara De fet, m'he criticat seg, i el meu programa té prou molt més efectivament renunciat. Aquest és el final del programa. Es va enfonsar, es va estavellar. Així que no era molt, però jo en realitat ho va fer aprendre una mica d'aquesta poca experiència. Què he après? Bé, el meu programa es bloqueja gairebé immediatament. El meu programa es bloqueja en Una crida a strcmp, però jo no tenen cap variables locals en el meu programa en el moment que s'estavella. Llavors, ¿quina cadena o cadenes, podria jo estar comparant. Si jo no tinc cap locals les variables, és possible que Conjecturo que tener-- pot haver és un variable global, que podria ser veritat. Però, en general, sembla com que estic comparant a una cosa que no existeix. Així que anem a investigar que una mica més enllà. Així que em vaig a netejar la meva pantalla. Vaig a deixar fora de la Entorn GDB per un segon. I estic pensant, bé, així que no no hi ha variables locals en el meu programa. Em pregunto si potser se suposa que he de passar en una cadena com un argument de línia d'ordres. Així que anem a provar això. No he fet això abans. Anem a veure si potser si executo aquest programa amb un argument de línia de comandes que funciona. Ei, no hi ha error de segmentació allà. Es m'acaba de dir que l'he descobert. Així que potser aquesta és la solució aquí. I de fet, si em vaig enrere i mirar el codi font real per buggy1.c, sembla com si el que estic fent és Estic fent una crida a strcmp sense comprovar si, de fet, argv [1] existeix. Això és en realitat la codi font per buggy1.c. Així que el que realment necessito fer aquí per arreglar el meu programa, suposant que tinc el presentar al davant de mi, és simplement afegir un xec per fer assegurar-se que argc és igual a 2. Així que aquest exemple, un cop més, com he dit, és una mica artificial, oi? En general, vostè no va a esborrar accidentalment el seu codi font i després haver de tractar i depurar el programa. Però és d'esperar, l'hi va donar que una il·lustració dels tipus de coses que vostè podria estar pensant en com vostè està depurar el seu programa. Quin és l'estat de coses aquí? Quines variables fer jo tenir accés al meu? On exactament és el meu programa estavellar-se, en quina línia, en el cridat a quina funció? Quin tipus de pistes ¿això em donen? I això és exactament el tipus de mentalitat que ha d'entrar en quan estàs pensant en la depuració dels programes. Sóc Doug Lloyd. Això és CS50.