<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ponton&#039;s site &#187; gdb</title>
	<atom:link href="http://www.ponton.srednikpe.org/tag/gdb/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ponton.srednikpe.org</link>
	<description>blog głównie matematyczno-informatyczny (nie chce mi się pisać o życiu)</description>
	<lastBuildDate>Mon, 18 Jan 2010 22:23:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>gdb</title>
		<link>http://www.ponton.srednikpe.org/2008/08/30/gdb/</link>
		<comments>http://www.ponton.srednikpe.org/2008/08/30/gdb/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 22:54:40 +0000</pubDate>
		<dc:creator>ponton</dc:creator>
				<category><![CDATA[Computer science and math]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Polskie]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[gdb]]></category>

		<guid isPermaLink="false">http://www.ponton.srednikpe.org/?p=52</guid>
		<description><![CDATA[Debuggowanie potrafi niemal wykładniczo skrócić czas szukania błędów w programie, więc warto nauczyć się sprawnie obsługiwać debugger. Dotychczas GNU Debugger był dla mnie czarną magią, a wzorem &#8212; ten  z Visual Studio. Tylko gdzieś słyszałem/czytałem, że gdb ma takie same możliwości, ale nie dane mi było się o tym przekonać. Niedawno musiałem się nauczyć jego [...]]]></description>
			<content:encoded><![CDATA[<p>Debuggowanie potrafi niemal wykładniczo skrócić czas szukania błędów w programie, więc warto nauczyć się sprawnie obsługiwać debugger. Dotychczas GNU Debugger był dla mnie czarną magią, a wzorem &#8212; ten  z Visual Studio. Tylko gdzieś słyszałem/czytałem, że gdb ma takie same możliwości, ale nie dane mi było się o tym przekonać. Niedawno musiałem się nauczyć jego obsługi, dlatego napiszę sobie ściągawkę (nie, żeby z niej korzystać, ale żeby utrwalić).</p>
<p><strong>Zanim zaczniesz</strong></p>
<p>Musisz najpierw skompilować program z informacjami dla gdb. Robi opcja -g dla gcc.</p>
<p><strong>Komendy</strong></p>
<p>Zamiast miłego interfejsu graficznego, jest miły wiersz poleceń (co dla programisty jest wygodniejsze, bo nie musi odrywać rąk od klawiatury :&gt;), w którym wpisujesz polecenia. Nie musisz podawać jej pełnej nazwy, wystarczy jednoznaczny początek (najczęstsze polecenia mają jedno/dwuliterowe synonimy). Działa dopełnienie tabulatorem! W razie czego: <strong>help komenda</strong>.</p>
<p><strong>Start</strong></p>
<p><strong></strong>Pierwszy paremtr to nazwa pliku wynikowego programu. Drugim może być numer procesu tego programu, jeśli chcesz zacząć debuggować już działający program.</p>
<p>Przydatne komendy:</p>
<ul>
<li><strong>run [argumenty]</strong> &#8211;  uruchamia program z podanymi (opcjonalnymi) argumentami</li>
<li><strong>continue</strong> &#8211; jeśli program jest zatrzymany, wznawia jego działanie</li>
<li><strong>finish</strong> &#8211; program się wykonuje aż do napotkania &#8220;return&#8221;; innymi słowy program działa aż do końca aktualnej ramki stosu</li>
</ul>
<p><strong>Stop</strong></p>
<p>Żeby się gdzieś zatrzymać, trzeba ustawić breakpointy:</p>
<ul>
<li><strong>breakpoint funkcja</strong> &#8211; ustala breakpoint na początek funkcji</li>
<li><strong>breakpoint [plik:]linia</strong> &#8211; ustala breakpoint na określoną linię pliku</li>
<li><strong>info breakpoints</strong> &#8211; wypisuje utawione breakpointy</li>
<li><strong>delete n</strong> &#8211; usuwa n-ty breakpoint</li>
<li><strong>condition n cond</strong> &#8211; ustala warunek dla n-tego breakpointa (program zatrzyma się na nim, jeśli zostanie spełniony warunek cond)</li>
<li><strong>^C </strong>- czyli przerwanie z klawiatury, również zatrzymuje działający program i oddaje kontrolę gdb</li>
</ul>
<p><strong>Co się dzieje?</strong></p>
<p>Kilka przydatnych komend, aby zorientować się, co się aktualnie dzieje:</p>
<ul>
<li><strong>list</strong> &#8211; listing kodu (10 linii obecnego kontekstu, podana nazwa funkcji, numer linii, etc.)</li>
<li><strong>frame</strong> &#8211; aktualna ramka stosu oraz aktualna instrukcja</li>
<li><strong>backtrace</strong> &#8211; ślad stosu</li>
<li><strong>print x</strong> &#8211; wypisanie wartości x (to może być dowolne wyrażenie, razem ze zmiennymi w programie)</li>
</ul>
<p><strong>Tropimy</strong></p>
<p>To, co najważniejsze, czyli śledzimy program krok po kroku:</p>
<ul>
<li><strong>next</strong> &#8211; następna instrukcja (lub n instrukcji), bez wchodzenia wgłąb procedur</li>
<li><strong>step</strong> &#8211; j/w, ale z wchodzeniem wgłąb</li>
</ul>
<p><strong>Psujemy</strong></p>
<p>Można przetestować kilka rzeczy w trakcie trwania programu:</p>
<ul>
<li><strong>set x wartość</strong> &#8211; ustawiamy zmiennej x wartość</li>
<li><strong>call f(x)</strong> &#8211; wywołujemy funkcję f z argumentami (w tym wypadku tylko x)</li>
</ul>
<p><strong>Format zapisu zmiennych, funkcji i adresów.</strong></p>
<p>Czasem chcemy się odwołać do zmiennej z jakiegoś innego zakresu albo funkcji składowej, wtedy piszemy zakres::x, jeśli np. zakres jest klasą, a x jej metodą/polem, albo zakres jest funkcją, a x jej zmienną lokalną. Odwołanie do konkretnej linii ma składnię plik:linia, np. test.c:244. Adres zapisujemy z gwiazdką na początku, np. *0&#215;000000.</p>
<p>A na koniec: <strong>quit</strong>. I tyle. To było zaledwie 1/5 możliwości gdb, mimo to spokojnie wystarczy do efektywnego debuggowania. Chociaż dziesiątki printfów mają swój urok. ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ponton.srednikpe.org/2008/08/30/gdb/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
