1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Maxima Manual: Отладка исходного кода</title>
<meta name="description" content="Maxima Manual: Отладка исходного кода">
<meta name="keywords" content="Maxima Manual: Отладка исходного кода">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="maxima_toc.html#Top" rel="start" title="Top">
<link href="maxima_264.html#g_t_0423_043a_0430_0437_0430_0442_0435_043b_044c-_0444_0443_043d_043a_0446_0438_0439-_0438-_043f_0435_0440_0435_043c_0435_043d_043d_044b_0445" rel="index" title="Указатель функций и переменных">
<link href="maxima_toc.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="maxima_150.html#g_t_041e_0442_043b_0430_0434_043a_0430" rel="up" title="Отладка">
<link href="maxima_152.html#g_t_0421_043f_0435_0446_0438_0430_043b_044c_043d_044b_0435-_043a_043e_043c_0430_043d_0434_044b" rel="next" title="Специальные команды">
<link href="maxima_150.html#g_t_041e_0442_043b_0430_0434_043a_0430" rel="previous" title="Отладка">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
body {color: black; background: white; margin-left: 8%; margin-right: 13%;
font-family: "FreeSans", sans-serif}
h1 {font-size: 150%; font-family: "FreeSans", sans-serif}
h2 {font-size: 125%; font-family: "FreeSans", sans-serif}
h3 {font-size: 100%; font-family: "FreeSans", sans-serif}
a[href] {color: rgb(0,0,255); text-decoration: none;}
a[href]:hover {background: rgb(220,220,220);}
div.textbox {border: solid; border-width: thin; padding-top: 1em;
padding-bottom: 1em; padding-left: 2em; padding-right: 2em}
div.titlebox {border: none; padding-top: 1em; padding-bottom: 1em;
padding-left: 2em; padding-right: 2em; background: rgb(200,255,255);
font-family: sans-serif}
div.synopsisbox {
border: none; padding-top: 1em; padding-bottom: 1em; padding-left: 2em;
padding-right: 2em; background: rgb(255,220,255);}
pre.example {border: 1px solid rgb(180,180,180); padding-top: 1em;
padding-bottom: 1em; padding-left: 1em; padding-right: 1em;
background-color: rgb(238,238,255)}
div.spacerbox {border: none; padding-top: 2em; padding-bottom: 2em}
div.image {margin: 0; padding: 1em; text-align: center}
div.categorybox {border: 1px solid gray; padding-top: 1em; padding-bottom: 1em;
padding-left: 1em; padding-right: 1em; background: rgb(247,242,220)}
img {max-width:80%; max-height: 80%; display: block; margin-left: auto; margin-right: auto}
-->
</style>
<link rel="icon" href="figures/favicon.ico">
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6>"></script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
</head>
<body lang="ru" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="g_t_041e_0442_043b_0430_0434_043a_0430-_0438_0441_0445_043e_0434_043d_043e_0433_043e-_043a_043e_0434_0430"></a>
<div class="header">
<p>
Next: <a href="maxima_152.html#g_t_0421_043f_0435_0446_0438_0430_043b_044c_043d_044b_0435-_043a_043e_043c_0430_043d_0434_044b" accesskey="n" rel="next">Специальные команды</a>, Up: <a href="maxima_150.html#g_t_041e_0442_043b_0430_0434_043a_0430" accesskey="u" rel="up">Отладка</a> [<a href="maxima_toc.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="maxima_264.html#g_t_0423_043a_0430_0437_0430_0442_0435_043b_044c-_0444_0443_043d_043a_0446_0438_0439-_0438-_043f_0435_0440_0435_043c_0435_043d_043d_044b_0445" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Otladka-na-urovne-iskhodnogo-koda"></a>
<h3 class="section">39.1 Отладка на уровне исходного кода</h3>
<p>Maxima имеет отладчик исходного кода.
Пользователь может определить в функции точку останова и
и продолжить выполнение с этой точки строка за строкой.
При этом возможно анализировать стек вызовов и переменные,
имеющие значение на данном уровне.
</p>
<p>Команда <code>:help</code>, или просто <code>:h</code>, выводит список команд отладчика.
(Команды могут быть сокращены, если сокращение однозначно.
Если оно неоднозначно, то будет выведен список альтернатив.)
В отладчике пользователь может также использовать обычные команды Maxima
для исследования, определения и манипулирования переменными и выражениями.
</p>
<p>Точка останова задается командой <code>:br</code> в командной строке Maxima.
В отладчике, пользователь может продвигаться по одной строке
за раз с помощью команды <code>:n</code> (“next”).
Команда <code>:bt</code> (“backtrace”) выводит список кадров стека.
Команда <code>:r</code> (“resume”) завершает отладчик и продолжает
выполнение программы. Данные команды проиллюстрированы в следующем примере.
</p>
<div class="example">
<pre class="example">(%i1) load ("/tmp/foobar.mac");
(%o1) /tmp/foobar.mac
(%i2) :br foo
Turning on debugging debugmode(true)
Bkpt 0 for foo (in /tmp/foobar.mac line 1)
(%i2) bar (2,3);
Bkpt 0:(foobar.mac 1)
/tmp/foobar.mac:1::
(dbm:1) :bt <-- :bt выводим обратную трассировку вызовов
#0: foo(y=5)(foobar.mac line 1)
#1: bar(x=2,y=3)(foobar.mac line 9)
(dbm:1) :n <-- :n продвигаем выполнение на одну строку
(foobar.mac 2)
/tmp/foobar.mac:2::
(dbm:1) :n <-- :n продвигаем выполнение на одну строку
(foobar.mac 3)
/tmp/foobar.mac:3::
(dbm:1) u; <-- Исследуем знасение переменной u
28
(dbm:1) u: 33; <-- Устанавливаем значение u равным 33
33
(dbm:1) :r <-- :r to возобновляем выполнение программы
(%o2) 1094
</pre></div>
<p>Содержимое файла <code>/tmp/foobar.mac</code>:
</p>
<div class="example">
<pre class="example">foo(y) := block ([u:y^2],
u: u+3,
u: u^2,
u);
bar(x,y) := (
x: x+2,
y: y+2,
x: foo(y),
x+y);
</pre></div>
<p>Использование Отладчика в Редакторе Emacs
</p>
<p>Если пользователь выполняет программу в командном окне
отладчика (dbl) редактора GNU emacs или в графической оболочке Xmaxima,
то при достижении точки останова в другой части окна будет показан
участок исходного кода с текущей строкой, выделенной либо красным цветом,
либо маленькой стрелкой. Пользователь может продолжить
выполнение программы построчно, нажимая M-n (Alt-n).
</p>
<p>Для использования в Emacs отладчика <code>dbl</code> требуется файл <code>dbl.el</code>,
расположенный в директории elisp.
Убедитесь, что файлы elisp установлены или добавьте директорию elisp программы Maxima
к пути: например, добавте следующие строки к файлу <samp>.emacs</samp> или файлу <code>site-init.el</code>
</p>
<div class="example">
<pre class="example">(setq load-path (cons "/usr/share/maxima/5.9.1/emacs" load-path))
(autoload 'dbl "dbl")
</pre></div>
<p>После этого при вводе
</p>
<div class="example">
<pre class="example">M-x dbl
</pre></div>
<p>в emacs должно открываться командное окно, в котором можно
выполнять программы, например, Maxima, gcl, gdb и т.д.
Это командное окно “знает” об отладке исходного кода,
который открыт в другом окне редактора.
</p>
<p>Пользователь может установить точку останова в определенной строке
кода, нажав на <code>C-x space</code>. При этом производится анализ: в какой функции находится
данная строка и на какой по порядку строке этой функции стоит курсор.
Если курсор расположен, скажем, на строке 2 функции <code>foo</code>, тогда
в командном окно будет введена команда “<code>:br foo 2</code>”, которая
задает точку останова на второй строке функции <code>foo</code>.
Для того, чтобы все это работало необходимо, чтобы в окне файла <code>foobar.mac</code>
был включен режим maxima-mode.el.
Существуют еще дополнительные команды, доступные в таком окне,
такие как вычисление функций Maxima при нажатии <code>Alt-Control-x</code>.
</p>
<a name="Item_003a-Debugging_002fnode_002f_0421_043f_0435_0446_0438_0430_043b_044c_043d_044b_0435-_043a_043e_043c_0430_043d_0434_044b"></a><hr>
<div class="header">
<p>
Next: <a href="maxima_152.html#g_t_0421_043f_0435_0446_0438_0430_043b_044c_043d_044b_0435-_043a_043e_043c_0430_043d_0434_044b" accesskey="n" rel="next">Специальные команды</a>, Up: <a href="maxima_150.html#g_t_041e_0442_043b_0430_0434_043a_0430" accesskey="u" rel="up">Отладка</a> [<a href="maxima_toc.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="maxima_264.html#g_t_0423_043a_0430_0437_0430_0442_0435_043b_044c-_0444_0443_043d_043a_0446_0438_0439-_0438-_043f_0435_0440_0435_043c_0435_043d_043d_044b_0445" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>
|