<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>https://wiki.cadt.com/index.php?action=history&amp;feed=atom&amp;title=Debugging</id>
	<title>Debugging - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cadt.com/index.php?action=history&amp;feed=atom&amp;title=Debugging"/>
	<link rel="alternate" type="text/html" href="https://wiki.cadt.com/index.php?title=Debugging&amp;action=history"/>
	<updated>2026-04-13T11:05:06Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://wiki.cadt.com/index.php?title=Debugging&amp;diff=2523&amp;oldid=prev</id>
		<title>Joan a 12:40, 7 gen 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.cadt.com/index.php?title=Debugging&amp;diff=2523&amp;oldid=prev"/>
		<updated>2015-01-07T12:40:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ca&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Versió més antiga&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisió del 12:40, 7 gen 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Línia 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línia 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:SAPO]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Devel]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Com Compilar ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Com Compilar ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joan</name></author>
	</entry>
	<entry>
		<id>https://wiki.cadt.com/index.php?title=Debugging&amp;diff=103&amp;oldid=prev</id>
		<title>Cadtsd: Protegit «Debugging» ([edit=autoconfirmed] (indefinit) [move=autoconfirmed] (indefinit))</title>
		<link rel="alternate" type="text/html" href="https://wiki.cadt.com/index.php?title=Debugging&amp;diff=103&amp;oldid=prev"/>
		<updated>2010-11-13T21:35:06Z</updated>

		<summary type="html">&lt;p&gt;Protegit «&lt;a href=&quot;/index.php/Debugging&quot; title=&quot;Debugging&quot;&gt;Debugging&lt;/a&gt;» ([edit=autoconfirmed] (indefinit) [move=autoconfirmed] (indefinit))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Com Compilar ==&lt;br /&gt;
&lt;br /&gt;
Per poder treballar amb el debugger hem de compilar en mode debug. Per això es fa servir el switch &amp;#039;&amp;#039;-g&amp;#039;&amp;#039; de &amp;#039;&amp;#039;gcc&amp;#039;&amp;#039;. No es recomanable treballar a l&amp;#039;hora amb funcions d&amp;#039;optimització (&amp;#039;&amp;#039;-O2&amp;#039;&amp;#039;). Als programes (no llibreries), hem d&amp;#039;afegir, a més, &amp;#039;&amp;#039;STRIP=no&amp;#039;&amp;#039; dintre del makefile.&lt;br /&gt;
&lt;br /&gt;
Una manera alternativa, es, per programes, pasar-li les opcions de makefile per argument:&lt;br /&gt;
 make CF=-g STRIP=no&lt;br /&gt;
&lt;br /&gt;
A llibreries&lt;br /&gt;
&lt;br /&gt;
 make CF=-g&lt;br /&gt;
&lt;br /&gt;
S&amp;#039;ha de tenir cura de que internament el Makefile estigui modificat per fer servir &amp;#039;$(CF)&amp;#039; a les opcions de cada sistema. La majoria ho estan.&lt;br /&gt;
&lt;br /&gt;
== Carregar ==&lt;br /&gt;
&lt;br /&gt;
 $ gdb ./binari&lt;br /&gt;
&lt;br /&gt;
Sortirà molt de texte i a la darrera línia, hem de fixar-nos que no digui &amp;#039;&amp;#039;(no debugging symbols found)&amp;#039;&amp;#039;. Això voldria dir que hem fallat a l&amp;#039;hora de compilar amb debug.&lt;br /&gt;
&lt;br /&gt;
No podem afegir els arguments a la mateixa línia de comandes del &amp;#039;&amp;#039;gdb&amp;#039;&amp;#039;, s&amp;#039;ha de fer una vegada l&amp;#039;hem carregat:&lt;br /&gt;
&lt;br /&gt;
 (gdb) set args -bla bla&lt;br /&gt;
&lt;br /&gt;
== Comandes diverses ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;gdb&amp;#039;&amp;#039; ens permet resumir les comandes. Per exemple, &amp;#039;&amp;#039;run&amp;#039;&amp;#039;, pot ser &amp;#039;&amp;#039;ru&amp;#039;&amp;#039; o &amp;#039;&amp;#039;r&amp;#039;&amp;#039;. Similarment &amp;#039;&amp;#039;continue&amp;#039;&amp;#039; o &amp;#039;&amp;#039;cont&amp;#039;&amp;#039; pero no &amp;#039;&amp;#039;c&amp;#039;&amp;#039; doncs hi ha col·lisions amb d&amp;#039;altres comandes. Aquí faré servir-les tal como jo estic acostumat, i no necessariament en el seu nom complert.&lt;br /&gt;
&lt;br /&gt;
S&amp;#039;ha de tenir especial cura de no presionar enter sense cap comanda escrita:&lt;br /&gt;
&lt;br /&gt;
 (gdb) // enter&lt;br /&gt;
&lt;br /&gt;
doncs &amp;#039;&amp;#039;gdb&amp;#039;&amp;#039; això ho interpreta com repetir la darrera comanda.&lt;br /&gt;
&lt;br /&gt;
=== Configurar arguments ===&lt;br /&gt;
&lt;br /&gt;
Podem afegir-hi redireccions de shell:&lt;br /&gt;
&lt;br /&gt;
 (gdb) set args -bla bla &amp;lt; fitxer 2&amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
No sortirà efecte fins al següent &amp;#039;&amp;#039;run&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Executar el programa ===&lt;br /&gt;
&lt;br /&gt;
 (gdb) r&lt;br /&gt;
&lt;br /&gt;
=== Breakpoints ===&lt;br /&gt;
&lt;br /&gt;
==== Afegir ====&lt;br /&gt;
&lt;br /&gt;
 (gdb) break NomFuncio&lt;br /&gt;
 (gdb) break NomFitxer.c:numlinea&lt;br /&gt;
&lt;br /&gt;
==== Eliminar actual ====&lt;br /&gt;
&lt;br /&gt;
 (gdb) clear&lt;br /&gt;
&lt;br /&gt;
Només funciona quan estem sobre la línia on es troba.&lt;br /&gt;
&lt;br /&gt;
==== Llistar ====&lt;br /&gt;
&lt;br /&gt;
 (gdb) info breakpoints&lt;br /&gt;
&lt;br /&gt;
==== Eliminar sel·lectivament ====&lt;br /&gt;
&lt;br /&gt;
 (gdb) delete 2&lt;br /&gt;
 (gdb) clear main&lt;br /&gt;
On 2 es el número que surt al llistar, &amp;#039;&amp;#039;main&amp;#039;&amp;#039; es el nom de funció on teníem un altre breakpoint.&lt;br /&gt;
&lt;br /&gt;
=== traçar ===&lt;br /&gt;
&lt;br /&gt;
 (gdb) n   // executa la línia on ens trobem&lt;br /&gt;
 (gdb) s   // executa la línia, entrant dintre de les funcions&lt;br /&gt;
 (gdb) adv 33 // executa fins que arribem a la línia 33&lt;br /&gt;
              // es lo mateix que un breakpoint però només una vegada&lt;br /&gt;
 (gdb) conti  // el programa continua l&amp;#039;execució per si mateix&lt;br /&gt;
 (gdb) r      // tornem a executar el programa des del començament&lt;br /&gt;
&lt;br /&gt;
=== Veure variables ===&lt;br /&gt;
&lt;br /&gt;
Per veure el contingut d&amp;#039;una variable fem &amp;#039;&amp;#039;print&amp;#039;&amp;#039;. Ens pot mostrar el contingut d&amp;#039;estructures, vectors, inclús operacions més complexes i el resultat de cridar a funcions.&lt;br /&gt;
&lt;br /&gt;
 (gdb) print sapo // com que es un punter ens mostra el seu valor&lt;br /&gt;
 $10 = (sapotype *) 0x88324c0&lt;br /&gt;
 (gdb) print *sapo // dereferenciem&lt;br /&gt;
 $11 = {maqnom = &amp;quot;jacq43b&amp;quot;, &amp;#039;\0&amp;#039; &amp;lt;repeats 248 times&amp;gt;, &lt;br /&gt;
  maqpath = &amp;#039;\0&amp;#039; &amp;lt;repeats 1023 times&amp;gt;, &lt;br /&gt;
  drawnom = &amp;quot;jacq43b&amp;quot;, &amp;#039;\0&amp;#039; &amp;lt;repeats 248 times&amp;gt;, &lt;br /&gt;
  drawpath = &amp;#039;\0&amp;#039; &amp;lt;repeats 1023 times&amp;gt;, &lt;br /&gt;
  drawdate = &amp;quot;\000\000\000\000\000\000\000&amp;quot;, &lt;br /&gt;
  [...]&lt;br /&gt;
 (gdb) print sapo-&amp;gt;maqnom // ens mostra tot el tamany del vector (256 bytes)&lt;br /&gt;
 $8 = &amp;quot;jacq43b&amp;quot;, &amp;#039;\0&amp;#039; &amp;lt;repeats 248 times&amp;gt;&lt;br /&gt;
 (gdb) print (char*)sapo-&amp;gt;maqnom // fem cast&lt;br /&gt;
 $9 = 0x88324c0 &amp;quot;jacq43b&amp;quot;&lt;br /&gt;
 (gdb) print is_jacquard_repeat &lt;br /&gt;
 $16 = {int (sapotype *, int)} 0x8190ea0 &amp;lt;is_jacquard_repeat&amp;gt;&lt;br /&gt;
 (gdb) print is_jacquard_repeat (sapo,1)&lt;br /&gt;
 $17 = 1&lt;br /&gt;
&lt;br /&gt;
Display es similar a &amp;#039;&amp;#039;print&amp;#039;&amp;#039; pero s&amp;#039;imprimirà per pantalla cada vegada que fem &amp;#039;n&amp;#039; o &amp;#039;s&amp;#039;. Es molt útil a bucles per veure com van evolucionant les variables.&lt;br /&gt;
&lt;br /&gt;
=== Watches ===&lt;br /&gt;
&lt;br /&gt;
Els &amp;#039;&amp;#039;watches&amp;#039;&amp;#039; son expressions que volem veure quan canvien. Voldríem fer:&lt;br /&gt;
&lt;br /&gt;
 (gdb) watch sapo-&amp;gt;maqnom[0]&lt;br /&gt;
 Hardware watchpoint 7: sapo-&amp;gt;maqnom[0]&lt;br /&gt;
 (gdb) conti&lt;br /&gt;
 Continuing.&lt;br /&gt;
&lt;br /&gt;
I quan canviem el maqnom al Machine Settings:&lt;br /&gt;
&lt;br /&gt;
 Hardware watchpoint 7: sapo-&amp;gt;maqnom[0]&lt;br /&gt;
&lt;br /&gt;
 Old value = 106 &amp;#039;j&amp;#039;&lt;br /&gt;
 New value = 75 &amp;#039;K&amp;#039;&lt;br /&gt;
 0x49298b96 in strcpy () from /lib/libc.so.6&lt;br /&gt;
 (gdb) &lt;br /&gt;
&lt;br /&gt;
De vegades això no funciona, diu:&lt;br /&gt;
 Hardware watchpoint 6 deleted because the program has left the block &lt;br /&gt;
 in which its expression is valid.&lt;br /&gt;
&lt;br /&gt;
Això ens passa per exemple al fer un watch de &amp;#039;&amp;#039;sapo&amp;#039;&amp;#039; quan &amp;#039;&amp;#039;sapo&amp;#039;&amp;#039; es una variable local (argument a la funció). Per fer el &amp;#039;&amp;#039;watchpoint&amp;#039;&amp;#039; moltes vegades ens va millor treballar amb direccions de memoria:&lt;br /&gt;
&lt;br /&gt;
 (gdb) print sapo&lt;br /&gt;
 $1 = (sapotype *) 0x88324c0&lt;br /&gt;
 (gdb) watch ((sapotype *) 0x88324c0)-&amp;gt;maqnom[0]&lt;br /&gt;
 Hardware watchpoint 3: ((struct sapostruct *) 142812352)-&amp;gt;maqnom[0]&lt;br /&gt;
 (gdb) &lt;br /&gt;
&lt;br /&gt;
D&amp;#039;aquesta manera el watchpoint funcionarà sempre que la direcció de memoria sigui vàlida, en aquest cas sempre perque &amp;#039;&amp;#039;sapo&amp;#039;&amp;#039; es realment una variable global.&lt;br /&gt;
&lt;br /&gt;
Per llistar/eliminar watchpoints es fan servir les mateixes comandes que per breakpoints.&lt;br /&gt;
&lt;br /&gt;
=== On estem ===&lt;br /&gt;
&lt;br /&gt;
Moltes vegades ens interessa saber des d&amp;#039;on s&amp;#039;ens ha cridat, o el programa pinya dintre d&amp;#039;una funció standar (ex. &amp;#039;&amp;#039;strcpy&amp;#039;&amp;#039;), etc. Per situar-nos fem:&lt;br /&gt;
&lt;br /&gt;
 (gdb) backtrace &lt;br /&gt;
 #0  0x49298b96 in strcpy () from /lib/libc.so.6&lt;br /&gt;
 #1  0x081b28ad in llibera (fil=0x8829480, sapo=0x88324c0, what=4)&lt;br /&gt;
     at /svn/svn.cadt.com/carta/devel/6.1.0/src/fonts/llibera.c:313&lt;br /&gt;
 #2  0x08110cd1 in do_fgetpro (fil=0x8829480, sapo=0x88324c0, mensa=0x8830000, &lt;br /&gt;
     pattern=0x883f2d0, &lt;br /&gt;
     fname=0xbf82c6e0 &amp;quot;/opt/sapo/users/adria/revisar/jm.drf&amp;quot;, load_temporal=0)&lt;br /&gt;
     at /svn/svn.cadt.com/carta/devel/6.1.0/src/fonts/fgetpro.c:82&lt;br /&gt;
 #3  0x0811101e in fgetpro (fil=0x8829480, sapo=0x88324c0, mensa=0x8830000, &lt;br /&gt;
     pattern=0x883f2d0, &lt;br /&gt;
     fname=0xbf82c6e0 &amp;quot;/opt/sapo/users/adria/revisar/jm.drf&amp;quot;, load_temporal=0)&lt;br /&gt;
     at /svn/svn.cadt.com/carta/devel/6.1.0/src/fonts/fgetpro.c:213&lt;br /&gt;
 #4  0x0820c092 in projectrecent (fil=0x8829480, mensa=0x8830000, &lt;br /&gt;
     sapo=0x88324c0, pattern=0x883f2d0, num=3)&lt;br /&gt;
     at /svn/svn.cadt.com/carta/devel/6.1.0/src/fonts/projectrecent.c:153&lt;br /&gt;
 #5  0x080b6a29 in main_loop (arglist=0x9dcee50)&lt;br /&gt;
     at /svn/svn.cadt.com/carta/devel/6.1.0/src/fonts/carta.c:593&lt;br /&gt;
 #6  0x085586aa in SAPO_Crash_Protect_Func ()&lt;br /&gt;
 #7  0x080b52ce in main (argc=1, argv=0xbf82e854)&lt;br /&gt;
     at /svn/svn.cadt.com/carta/devel/6.1.0/src/fonts/carta.c:327&lt;br /&gt;
 (gdb) &lt;br /&gt;
&lt;br /&gt;
Aquí veiem que ens trobem dintre de &amp;#039;&amp;#039;strcpy&amp;#039;&amp;#039; (no tenim nom de fitxer ni línia per que /lib/libc.so.6 no està compilat amb debug). Aquest strcpy s&amp;#039;ha cridat des de la línia llibera.c:313, etc. Realment no es la línia des d&amp;#039;on s&amp;#039;ha cridat sinó la línia següent (a on retornarem).&lt;br /&gt;
&lt;br /&gt;
En alguns casos també necessitem saber a quin thread estem:&lt;br /&gt;
&lt;br /&gt;
 (gdb) thread&lt;br /&gt;
 [Current thread is 1 (Thread 1115840 (LWP 22397))]&lt;br /&gt;
 (gdb) info threads&lt;br /&gt;
  2 Thread 13278096 (LWP 22400)  0x002a4402 in __kernel_vsyscall ()&lt;br /&gt;
* 1 Thread 1115840 (LWP 22397)  0x49298b96 in strcpy () from /lib/libc.so.6&lt;br /&gt;
&lt;br /&gt;
També podem canviar de thread:&lt;br /&gt;
&lt;br /&gt;
 (gdb) thread 2&lt;br /&gt;
 [Switching to thread 2 (Thread 13278096 (LWP 22400))]#0  0x002a4402 in __kernel_vsyscall ()&lt;br /&gt;
 (gdb) backtrace &lt;br /&gt;
 #0  0x002a4402 in __kernel_vsyscall ()&lt;br /&gt;
 #1  0x493aa1c8 in recvfrom () from /lib/libpthread.so.0&lt;br /&gt;
 #2  0x08573b0a in libsm_recv_any_buf (sock=6, buf=0xca91d0 &amp;quot;&amp;quot;, ep=0xca8e80)&lt;br /&gt;
     at /svn/svn.cadt.com/libsapomngr/trunk/src/fonts/comms.c:236&lt;br /&gt;
 #3  0x08573b82 in libsm_recv_from_buf (sock=6, buf=0xca91d0 &amp;quot;&amp;quot;, ep=0x9da90c0)&lt;br /&gt;
     at /svn/svn.cadt.com/libsapomngr/trunk/src/fonts/comms.c:263&lt;br /&gt;
 #4  0x08573bfc in libsm_recv_from (sock=6, msg=0xca91d0, ep=0x9da90c0)&lt;br /&gt;
     at /svn/svn.cadt.com/libsapomngr/trunk/src/fonts/comms.c:289&lt;br /&gt;
 [...]&lt;br /&gt;
&lt;br /&gt;
En aquest cas estem al thread dintre de libsapo que es dedica a esperar que un altre carta ens digui &amp;#039;&amp;#039;RAISE&amp;#039;&amp;#039; i mostrar la finestra X.&lt;/div&gt;</summary>
		<author><name>Cadtsd</name></author>
	</entry>
</feed>