<?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>Работа для  программистов &#187; C/C++</title>
	<atom:link href="http://job-interview.ru/articles/post/category/cplusplus/feed" rel="self" type="application/rss+xml" />
	<link>http://job-interview.ru/articles</link>
	<description>вакансии, вопросы, статьи</description>
	<lastBuildDate>Thu, 29 Mar 2012 20:53:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Отладка программ в командной строке Linux</title>
		<link>http://job-interview.ru/articles/post/160</link>
		<comments>http://job-interview.ru/articles/post/160#comments</comments>
		<pubDate>Sat, 31 Oct 2009 18:08:33 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[отладка]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[язык C]]></category>

		<guid isPermaLink="false">/articles/?p=160</guid>
		<description><![CDATA[
Как известно, все программисты при написании программ допускают ошибки. Не думаю, что найдется хоть один разработчик, который,как-то решив разработать более-менее сложное приложение, сел за свой компьютер, открыл любимый редактор, набрал нужный код, скомпоновал его и после запуска программа сделала все то, что от нее требовалось.


Все это из области фантастики. Каждый из нас допускает ошибки, поэтому [...]]]></description>
			<content:encoded><![CDATA[<p>
Как известно, все <em>программисты</em> при написании программ допускают ошибки. Не думаю, что найдется хоть один разработчик, который,как-то решив разработать более-менее сложное приложение, сел за свой компьютер, открыл любимый редактор, набрал нужный код, скомпоновал его и после запуска программа сделала все то, что от нее требовалось.
</p>
<p><a target="_blank" href="http://6.joinru.programmerinfo.e-autopay.com/"><img src="/img/courses/C++bannergif.gif"></a></p>
<p>Все это из области фантастики. Каждый из нас допускает ошибки, поэтому нам нужно их как-то отлавливать. </p>
<p>Если <em>ошибка синтаксическая</em>, то  в большинстве случаев на это укажет компилятор. Но, если  <strong>ошибка логическая</strong>, то часто <em>программист</em> сам не в состоянии определить ее.</p>
<p>Конечно, если <em>программа</em> не сложная, то можно самостоятельно, не прибегая ни к каким дополнительным средствам, выявить ошибку.</p>
<p>Однако, в больших программах самостоятельно отследить тот момент, когда программа начинает вести себя неправильно в большинстве случаев просто невозможно. В таких ситуациях на помощь приходят <strong>отладчики</strong>, которые позволяют программисту пройти по пути работы программы, отслеживая при этом ее состояние в определенные моменты времени выполнения.</p>
<p>В этой статье рассказывается об <strong>отладке программ</strong>, написанных на языке C, в <em>командной строке Linux</em> с использованием утилиты <strong>GDB</strong>.</p>
<p><span id="more-160"></span></p>
<p>Многие программисты, которые с успехом разрабатывали свои приложения на <strong>языках C/C++</strong> для <em>Windows</em>, после перехода к разработке программ на том же языке, но под ОС семейства <em>Linux</em> с удивлением обнаруживают, что отсутствует возможность той отладки, которой они пользовались в редакторах при написании программ для <em>Windows</em>.</p>
<p>Однако, такая возможность есть и это <strong>отладчик GDB</strong>.</p>
<p>Как следует из документации к этой утилите «<em>цель отладчика GDB</em>  &#8211; это позволить вам увидеть, что происходит внутри программы пока она выполняется, или что программа делает в момент ее краха.».</p>
<p>На момент написания этой статьи <strong>отладчик GDB</strong> работает с программами, написанными на <em>языках C, C++, Modula-2</em>. Мы будем отлаживать приложение, написанное на <strong>языке C</strong>.</p>
<p>Давайте начнем с приведения кода программы, которая в качестве аргумента принимает число и высчитывает <em>факториал</em> этого числа при помощи <em>рекурсии</em>. Ее мы и будем отлаживать.</p>
<p><div class="wp_syntax">
<table>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre>
</td>
<td class="code">
<pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> fact<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> num<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>num <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> num <span style="color: #339933;">*</span> fact<span style="color: #009900;">&#40;</span>num <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d! = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> fact<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre>
</td>
</tr>
</table>
</div>
<p>Теперь скомпилируем ее с включением отладочной информации. Для этого в командной строке заходим в директорию, в которой лежит наш файл с расширением .c и выполняем команду:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">g++</span> <span style="color: #660033;">-g</span> fact.c <span style="color: #660033;">-o</span> fact</pre>
</div>
</div>
<p>Опция <em>-g</em> сообщает <em>компилятору</em> о том, что в программу нужно включить отладочную информацию, которой и воспользуется <strong>отладчик GDB</strong>. </p>
<p>Опция <em>-o</em> сообщает <strong>компилятору g++</strong> путь до исполняемого файла. Если ее не указать, то, по умолчанию, компилятор создаст исполняемый файл в той же директории, где находится наша программа, и назовет его a.out.</p>
<p>Теперь запустим нашу программу в режиме отладки:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">gdb</span> <span style="color: #660033;">-q</span> fact</pre>
</div>
</div>
<p>Опцию <em>-q</em> можно не указывать, она используется лишь для того, чтобы при первом заходе в отладчик не выводилась информация о версии, лицензионное соглашение и т.д.</p>
<p>Итак, мы запустили отладчик. Теперь мы можем выполнять его команды.</p>
<p>Для просмотра исходного кода программы используется команда <em>list</em>, в которую можно передать номер строки для того, чтобы вывести код, окружающий переданную строку. </p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> list <span style="color: #000000;">10</span>
<span style="color: #000000;">5</span>       int fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>int num<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">6</span>       <span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #000000;">7</span>           <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">8</span>           <span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #000000;">9</span>             <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">1</span>;
<span style="color: #000000;">10</span>          <span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #000000;">11</span>
<span style="color: #000000;">12</span>          <span style="color: #7a0874; font-weight: bold;">return</span> num <span style="color: #000000; font-weight: bold;">*</span> fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>num - <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000;">13</span>      <span style="color: #7a0874; font-weight: bold;">&#125;</span></pre>
</div>
</div>
<p>Также можно передать название функции, после чего будет выведен код, окружающий эту функцию.</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> list fact
<span style="color: #000000;">1</span>       <span style="color: #666666; font-style: italic;">#include &lt;stdio.h&gt;</span>
<span style="color: #000000;">2</span>       <span style="color: #666666; font-style: italic;">#include &lt;stdlib.h&gt;</span>
<span style="color: #000000;">3</span>       <span style="color: #666666; font-style: italic;">#include &lt;unistd.h&gt;</span>
<span style="color: #000000;">4</span>
<span style="color: #000000;">5</span>       int fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>int num<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">6</span>       <span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #000000;">7</span>           <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">8</span>           <span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #000000;">9</span>             <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">1</span>;
<span style="color: #000000;">10</span>          <span style="color: #7a0874; font-weight: bold;">&#125;</span></pre>
</div>
</div>
<p>Давайте запустим теперь <strong>выполнение программы под отладчиком</strong>. Это можно сделать одной из двух команд: <em>run</em> или <em>start</em>.</p>
<p>Отличие между этими двумя командами в том, что, вызвав команду <em>start</em>, отладчик останавливается на входе в функцию main, а команда <em>run</em> выполняется до тех пор, пока не наткнется на <strong>точку останова</strong> (о них чуть позднее).</p>
<p>Обе эти команды принимают в качестве параметра аргументы программы так же, как если бы программа запускалась из командной строки.</p>
<p>Итак, запустим программу на выполнение в режиме отладки:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> start <span style="color: #000000;">4</span>
Temporary breakpoint <span style="color: #000000;">2</span> at 0x8048556: <span style="color: #c20cb9; font-weight: bold;">file</span> fact.c, line 17.
Temporary breakpoint <span style="color: #000000;">2</span>, main <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">argc</span>=<span style="color: #000000;">2</span>, <span style="color: #007800;">argv</span>=0xbffffa24<span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">17</span>
<span style="color: #000000;">17</span>        int a = atoi<span style="color: #7a0874; font-weight: bold;">&#40;</span>argv<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;</pre>
</div>
</div>
<p>Как видим, отладчик остановился сразу же на входе в функцию main, а также вывел код и номер строки, перед которой остановился.</p>
<p>Используя команду <em>print</em>, мы можем вывести значения переменных и выражений. Посмотрим какие входные аргументы приняла наша программа:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> print argv<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
$<span style="color: #000000;">1</span> = 0xbffffb41 <span style="color: #ff0000;">&quot;/home/user/cpp/fact&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> print argv<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
$<span style="color: #000000;">2</span> = 0xbffffb5f <span style="color: #ff0000;">&quot;4&quot;</span></pre>
</div>
</div>
<p>В нулевом элементе массива argv содержится путь до выполняемой программы, а в первом элементе наш переданный аргумент — 4.</p>
<p>Для того, чтобы перейти на следующую строку, необходимо выполнить команду <em>step</em> или <em>next</em>.</p>
<p>Используя эти команды, можно передвигаться по программе. Отличие этих команд состоит в том, что <em>step</em> будет заходить внутрь функции каждый раз, когда ее встретит, а <em>next</em> пойдет дальше.</p>
<p>Перейдем к следующей строке:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
<span style="color: #000000;">18</span>        <span style="color: #7a0874; font-weight: bold;">printf</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;%d! = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a, fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>a<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;</pre>
</div>
</div>
<p>Мы сделали один шаг и остановились перед 18-ой строкой.</p>
<p>Пойдем дальше:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
fact <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">num</span>=<span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">7</span>
<span style="color: #000000;">7</span>           <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span></pre>
</div>
</div>
<p>Мы вошли в функцию fact с входным параметром 4 и оказались перед 7-ой строкой.</p>
<p>Т.к. мы имеем дело с рекурсией, то, вероятно, нам будет интересно значение переменной num, которое будет изменяться при каждом рекурсивном входе в функцию fact.</p>
<p>Добавим в процесс отладки слежение за переменной num. Для этого существует команда <em>display</em>, которой необходимо передать название переменной. В нашем случае это будет переменная num.</p>
<p>Выполним команду <em>display</em> и перейдем на один шаг вперед:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> display num
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">4</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
<span style="color: #000000;">12</span>          <span style="color: #7a0874; font-weight: bold;">return</span> num <span style="color: #000000; font-weight: bold;">*</span> fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>num - <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">4</span></pre>
</div>
</div>
<p>Как видим, теперь при каждой остановке программы <strong>отладчик GDB</strong> сообщает нам значение переменной num.</p>
<p>Сейчас мы находимся перед рекурсивным входом в функцию fact. Заходим в нее и делаем еще один шаг вперед:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
fact <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">num</span>=<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">7</span>
<span style="color: #000000;">7</span>           <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">3</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
<span style="color: #000000;">12</span>          <span style="color: #7a0874; font-weight: bold;">return</span> num <span style="color: #000000; font-weight: bold;">*</span> fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>num - <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">3</span></pre>
</div>
</div>
<p>Отладчик сообщает нам значение переменной num, которое уже равно 3. Сейчас мы снова находимся перед заходом в функцию fact. </p>
<p>Скорее всего, не имеет смысла каждый раз проделывать эти шаги в функции fact. Нам достаточно было бы отслеживать какие значения принимает переменная num в 12-ой строке, т.к. в этой строке происходит рекурсивный вызов функции, а также возвращается результат ее выполнения.</p>
<p>Для того, чтобы добиться поставленных целей, мы можем поставить <strong>точки останова</strong>. Наша рассматриваемая программа достаточно не велика, поэтому мы могли бы пройти по каждой строке, используя отладчик, вплоть до завершения программы.</p>
<p>Однако, в реальных программах <em>программисты</em> отлаживают код, который содержит в себе тысячи строк. Если бы для отладки такого кода пришлось бы обойти каждую строку, то это превратилось бы в долгую и муторную работу.</p>
<p>Расставив <strong>точки останова</strong>, отладчик может «перепрыгивать» к строкам, на которых они поставлены, минуя весь остальной код. Для этого можно использовать команду <em>continue</em>, которая продолжает выполнение программы до тех пор, пока не встретится <strong>точка останова</strong>. Если их нет, то программа выполнится до конца.</p>
<p>Итак, давайте поставим точку останова в строке 12 и выполним команду <em>continue</em>, чтобы продолжить программу до тех пор, пока не наткнемся на строку 12:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">break</span> <span style="color: #000000;">12</span>
Breakpoint <span style="color: #000000;">2</span> at 0x8048529: <span style="color: #c20cb9; font-weight: bold;">file</span> fact.c, line 12.
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">continue</span>
Continuing.
&nbsp;
Breakpoint <span style="color: #000000;">2</span>, fact <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">num</span>=<span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">12</span>
<span style="color: #000000;">12</span>          <span style="color: #7a0874; font-weight: bold;">return</span> num <span style="color: #000000; font-weight: bold;">*</span> fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>num - <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">2</span></pre>
</div>
</div>
<p>Мы прошли все шаги, которые до этого проделывали командой <em>step</em>. Теперь, каждый раз выполняя команду <em>continue</em> мы будем оказываться на 12-ой строке, а, благодаря выполненной ранее команде <em>display</em>, мы сможем наблюдать как изменяется значение переменной num на каждом шаге.</p>
<p>Есть и другой способ следить за изменением переменной в ходе работы программы с использованием команды <em>watch</em>. В отличие от команды <em>display</em>, эта команда при каждом изменении переменной, переданной в качестве параметра, будет останавливать выполнение программы и выводить старое и новое значение переменной.</p>
<p>Обе команды <em>display</em> и <em>watch</em> могут в качестве параметра принимать не только переменные, но и выражения.</p>
<p>Продолжим выполнение программы:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">continue</span>
Continuing.
<span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">!</span> = <span style="color: #000000;">24</span>
&nbsp;
Program exited normally.</pre>
</div>
</div>
<p>Отладчик показал вывод нашей программы, а именно подсчитанный факториал от 4. Последняя строка в выводе отладчика сообщает, что программа завершилась. Отладчик также вывел бы код возврата программы в восьмеричной форме, если бы программа возвращала число, отличное от нуля.</p>
<p>Очень полезной может оказаться команда <em>set variable</em>, которая позволяет изменять значение переменной по ходу выполнения программы:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>linux-hn2z:~<span style="color: #000000; font-weight: bold;">/</span>cpp<span style="color: #000000; font-weight: bold;">/&gt;</span> <span style="color: #c20cb9; font-weight: bold;">gdb</span> <span style="color: #660033;">-q</span> fact
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> start <span style="color: #000000;">4</span>
Temporary breakpoint <span style="color: #000000;">1</span> at 0x8048556: <span style="color: #c20cb9; font-weight: bold;">file</span> fact.c, line 17.
Starting program: <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>user<span style="color: #000000; font-weight: bold;">/</span>cpp<span style="color: #000000; font-weight: bold;">/</span>fact <span style="color: #000000;">4</span>
&nbsp;
Temporary breakpoint <span style="color: #000000;">1</span>, main <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">argc</span>=<span style="color: #000000;">2</span>, <span style="color: #007800;">argv</span>=0xbfffef84<span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">17</span>
<span style="color: #000000;">17</span>        int a = atoi<span style="color: #7a0874; font-weight: bold;">&#40;</span>argv<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
<span style="color: #000000;">18</span>        <span style="color: #7a0874; font-weight: bold;">printf</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;%d! = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a, fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>a<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">set</span> variable <span style="color: #007800;">a</span>=<span style="color: #000000;">10</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> c
Continuing.
<span style="color: #000000;">10</span><span style="color: #000000; font-weight: bold;">!</span> = <span style="color: #000000;">3628800</span></pre>
</div>
</div>
<p>В этом примере мы запустили программу с входным параметром — 4, но по ходу выполнения программы мы заменили этот параметр на 10, и программа подсчитала факториал от 10.</p>
<p>Команду <em>set variable</em> можно применять, например, когда вы на каком-то шаге обнаружили, что программа ведет себя не верно, но путем изменения значения переменной можно исправить ситуацию и посмотреть как программа будет вести себя дальше.</p>
<p>В настоящей статье описаны далеко не все <strong>возможности отладчика GDB</strong>. За более подробными руководствами обращайтесь к документации по утилите, кроме того, находясь в отладчике, можно вывести список всех команд и описаний к ним, воспользовавшись командой <em>help</em>.</p>
<p>На этом все. Удачной отладки.</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/160/feed</wfw:commentRss>
		<slash:comments>639</slash:comments>
		</item>
	</channel>
</rss>
