From 30edf60b99c6ecbf28adac72c1f0fe73df3f6022 Mon Sep 17 00:00:00 2001 From: "R. Bernstein" Date: Fri, 16 Feb 2024 11:36:58 -0500 Subject: [PATCH] First batch of doc cleanups (#21) * First batch of doc cleanups * zsh{,db} -> bash{,db} and other doc fixes * zsh{,db} -> bash{,db} and other doc fixes * Gratuituous change to get readthe docs to reread? --- .readthedocs.yaml | 36 + README.md | 2 +- command/break.sh | 2 +- command/condition.sh | 4 +- command/next.sh | 13 +- command/skip.sh | 5 +- command/step.sh | 18 +- docs/.gitignore | 3 + docs/Makefile | 26 + docs/commands.rst | 19 + docs/commands/Makefile | 9 + docs/commands/breakpoints.rst | 56 + docs/commands/breakpoints/Makefile | 9 + docs/commands/breakpoints/break.rst | 27 + docs/commands/breakpoints/condition.rst | 24 + docs/commands/breakpoints/delete.rst | 13 + docs/commands/breakpoints/disable.rst | 14 + docs/commands/breakpoints/enable.rst | 14 + docs/commands/breakpoints/tbreak.rst | 30 + docs/commands/data.rst | 13 + docs/commands/data/display.rst | 25 + docs/commands/data/eval.rst | 52 + docs/commands/data/examine.rst | 28 + docs/commands/data/load.rst | 13 + docs/commands/data/undisplay.rst | 17 + docs/commands/files.rst | 10 + docs/commands/files/edit.rst | 14 + docs/commands/files/list.rst | 54 + docs/commands/info.rst | 24 + docs/commands/info/Makefile | 9 + docs/commands/info/breakpoints.rst | 36 + docs/commands/info/display.rst | 13 + docs/commands/info/files.rst | 13 + docs/commands/info/functions.rst | 23 + docs/commands/info/line.rst | 21 + docs/commands/info/program.rst | 28 + docs/commands/info/source.rst | 23 + docs/commands/info/stack.rst | 13 + docs/commands/info/variables.rst | 30 + docs/commands/running.rst | 25 + docs/commands/running/continue.rst | 26 + docs/commands/running/debug.rst | 17 + docs/commands/running/kill.rst | 41 + docs/commands/running/next.rst | 25 + docs/commands/running/quit.rst | 16 + docs/commands/running/run.rst | 13 + docs/commands/running/skip.rst | 32 + docs/commands/running/step.rst | 37 + docs/commands/set.rst | 38 + docs/commands/set/annotate.rst | 19 + docs/commands/set/args.rst | 14 + docs/commands/set/autoeval.rst | 32 + docs/commands/set/autolist.rst | 47 + docs/commands/set/basename.rst | 23 + docs/commands/set/confirm.rst | 18 + docs/commands/set/debug.rst | 17 + docs/commands/set/different.rst | 29 + docs/commands/set/editing.rst | 13 + docs/commands/set/filename-display.rst | 20 + docs/commands/set/highlight.rst | 44 + docs/commands/set/linetrace.rst | 13 + docs/commands/set/listsize.rst | 13 + docs/commands/set/style.rst | 28 + docs/commands/set/trace-commands.rst | 13 + docs/commands/set/width.rst | 13 + docs/commands/show.rst | 31 + docs/commands/show/Makefile | 9 + docs/commands/show/aliases.rst | 18 + docs/commands/show/annotate.rst | 19 + docs/commands/show/args.rst | 9 + docs/commands/show/autoeval.rst | 13 + docs/commands/show/autolist.rst | 13 + docs/commands/show/basename.rst | 19 + docs/commands/show/confirm.rst | 13 + docs/commands/show/different.rst | 11 + docs/commands/show/editing.rst | 13 + docs/commands/show/filename-display.rst | 13 + docs/commands/show/highlight.rst | 13 + docs/commands/show/linetrace.rst | 13 + docs/commands/show/listsize.rst | 13 + docs/commands/show/style.rst | 13 + docs/commands/show/trace-commands.rst | 13 + docs/commands/show/width.rst | 13 + docs/commands/stack.rst | 23 + docs/commands/stack/backtrace.rst | 24 + docs/commands/stack/down.rst | 19 + docs/commands/stack/frame.rst | 36 + docs/commands/stack/up.rst | 14 + docs/commands/support.rst | 10 + docs/commands/support/alias.rst | 27 + docs/commands/support/help.rst | 21 + docs/commands/support/source.rst | 18 + docs/commands/support/unalias.rst | 13 + docs/conf.py | 173 + docs/entry-exit.rst | 86 + docs/features.rst | 69 + docs/index.rst | 38 + docs/install.rst | 97 + docs/make.bat | 36 + docs/manpage.rst | 173 + docs/syntax.rst | 8 + docs/syntax/command.rst | 44 + docs/syntax/suffixes.rst | 24 + htdocs/remake/download.html | 54 - htdocs/remake/features.html | 53 - htdocs/remake/index.html | 199 -- htdocs/remake/links2linux.de.png | Bin 2092 -> 0 bytes htdocs/remake/mdb-old.html | 4193 ----------------------- htdocs/remake/mdb.html | 8 - htdocs/remake/openlogo-nd-25.png | Bin 422 -> 0 bytes htdocs/remake/remake-ddd.png | Bin 45687 -> 0 bytes htdocs/remake/source-code.gif | Bin 1142 -> 0 bytes readthedocs.yaml | 35 + test/example/stepping.sh | 2 +- 114 files changed, 2640 insertions(+), 4525 deletions(-) create mode 100644 .readthedocs.yaml create mode 100644 docs/.gitignore create mode 100644 docs/Makefile create mode 100644 docs/commands.rst create mode 100644 docs/commands/Makefile create mode 100644 docs/commands/breakpoints.rst create mode 100644 docs/commands/breakpoints/Makefile create mode 100644 docs/commands/breakpoints/break.rst create mode 100644 docs/commands/breakpoints/condition.rst create mode 100644 docs/commands/breakpoints/delete.rst create mode 100644 docs/commands/breakpoints/disable.rst create mode 100644 docs/commands/breakpoints/enable.rst create mode 100644 docs/commands/breakpoints/tbreak.rst create mode 100644 docs/commands/data.rst create mode 100644 docs/commands/data/display.rst create mode 100644 docs/commands/data/eval.rst create mode 100644 docs/commands/data/examine.rst create mode 100644 docs/commands/data/load.rst create mode 100644 docs/commands/data/undisplay.rst create mode 100644 docs/commands/files.rst create mode 100644 docs/commands/files/edit.rst create mode 100644 docs/commands/files/list.rst create mode 100644 docs/commands/info.rst create mode 100644 docs/commands/info/Makefile create mode 100644 docs/commands/info/breakpoints.rst create mode 100644 docs/commands/info/display.rst create mode 100644 docs/commands/info/files.rst create mode 100644 docs/commands/info/functions.rst create mode 100644 docs/commands/info/line.rst create mode 100644 docs/commands/info/program.rst create mode 100644 docs/commands/info/source.rst create mode 100644 docs/commands/info/stack.rst create mode 100644 docs/commands/info/variables.rst create mode 100644 docs/commands/running.rst create mode 100644 docs/commands/running/continue.rst create mode 100644 docs/commands/running/debug.rst create mode 100644 docs/commands/running/kill.rst create mode 100644 docs/commands/running/next.rst create mode 100644 docs/commands/running/quit.rst create mode 100644 docs/commands/running/run.rst create mode 100644 docs/commands/running/skip.rst create mode 100644 docs/commands/running/step.rst create mode 100644 docs/commands/set.rst create mode 100644 docs/commands/set/annotate.rst create mode 100644 docs/commands/set/args.rst create mode 100644 docs/commands/set/autoeval.rst create mode 100644 docs/commands/set/autolist.rst create mode 100644 docs/commands/set/basename.rst create mode 100644 docs/commands/set/confirm.rst create mode 100644 docs/commands/set/debug.rst create mode 100644 docs/commands/set/different.rst create mode 100644 docs/commands/set/editing.rst create mode 100644 docs/commands/set/filename-display.rst create mode 100644 docs/commands/set/highlight.rst create mode 100644 docs/commands/set/linetrace.rst create mode 100644 docs/commands/set/listsize.rst create mode 100644 docs/commands/set/style.rst create mode 100644 docs/commands/set/trace-commands.rst create mode 100644 docs/commands/set/width.rst create mode 100644 docs/commands/show.rst create mode 100644 docs/commands/show/Makefile create mode 100644 docs/commands/show/aliases.rst create mode 100644 docs/commands/show/annotate.rst create mode 100644 docs/commands/show/args.rst create mode 100644 docs/commands/show/autoeval.rst create mode 100644 docs/commands/show/autolist.rst create mode 100644 docs/commands/show/basename.rst create mode 100644 docs/commands/show/confirm.rst create mode 100644 docs/commands/show/different.rst create mode 100644 docs/commands/show/editing.rst create mode 100644 docs/commands/show/filename-display.rst create mode 100644 docs/commands/show/highlight.rst create mode 100644 docs/commands/show/linetrace.rst create mode 100644 docs/commands/show/listsize.rst create mode 100644 docs/commands/show/style.rst create mode 100644 docs/commands/show/trace-commands.rst create mode 100644 docs/commands/show/width.rst create mode 100644 docs/commands/stack.rst create mode 100644 docs/commands/stack/backtrace.rst create mode 100644 docs/commands/stack/down.rst create mode 100644 docs/commands/stack/frame.rst create mode 100644 docs/commands/stack/up.rst create mode 100644 docs/commands/support.rst create mode 100644 docs/commands/support/alias.rst create mode 100644 docs/commands/support/help.rst create mode 100644 docs/commands/support/source.rst create mode 100644 docs/commands/support/unalias.rst create mode 100644 docs/conf.py create mode 100644 docs/entry-exit.rst create mode 100644 docs/features.rst create mode 100644 docs/index.rst create mode 100644 docs/install.rst create mode 100644 docs/make.bat create mode 100644 docs/manpage.rst create mode 100644 docs/syntax.rst create mode 100644 docs/syntax/command.rst create mode 100644 docs/syntax/suffixes.rst delete mode 100644 htdocs/remake/download.html delete mode 100644 htdocs/remake/features.html delete mode 100644 htdocs/remake/index.html delete mode 100644 htdocs/remake/links2linux.de.png delete mode 100644 htdocs/remake/mdb-old.html delete mode 100644 htdocs/remake/mdb.html delete mode 100644 htdocs/remake/openlogo-nd-25.png delete mode 100644 htdocs/remake/remake-ddd.png delete mode 100644 htdocs/remake/source-code.gif create mode 100644 readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000..d71b4244 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,36 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.12" + # You can also specify other tool versions: + # nodejs: "20" + # rust: "1.70" + # golang: "1.20" + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + # fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: +# - pdf +# - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +# python: +# install: +# - requirements: docs/requirements.txt +# diff --git a/README.md b/README.md index c53b6320..2f40fb30 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Build Status Circle](https://circleci.com/gh/rocky/bashdb.svg?&style=shield)](https://circleci.com/gh/rocky/bashdb) -[![Packaging status](https://repology.org/badge/vertical-allrepos/zshdb.svg)](https://repology.org/project/zshdb/versions) +[![Packaging status](https://repology.org/badge/vertical-allrepos/bashdb.svg)](https://repology.org/project/bashdb/versions) Here, we have a debugger for Bash 5.2 and higher. diff --git a/command/break.sh b/command/break.sh index 36fd2131..07e7e285 100644 --- a/command/break.sh +++ b/command/break.sh @@ -34,7 +34,7 @@ See also: "tbreak" and "continue"' _Dbg_help_add tbreak \ -'**tbreak* [*loc-spec*] +'**tbreak** [ *location* ] [**if** *condition*] Set a one-time breakpoint at *loc-spec*. diff --git a/command/condition.sh b/command/condition.sh index c91f748d..e4047f88 100644 --- a/command/condition.sh +++ b/command/condition.sh @@ -1,7 +1,7 @@ # -*- shell-script -*- # condition.sh - gdb-like "condition" debugger command # -# Copyright (C) 2002-2006, 2008, 2009, 2011, 2016, 2019 +# Copyright (C) 2002-2006, 2008, 2009, 2011, 2016, 2019, 2024 # Rocky Bernstein rocky@gnu.org # # This program is free software; you can redistribute it and/or @@ -24,7 +24,7 @@ _Dbg_help_add condition \ Break only if *bash-cond* is true in breakpoint number *bp_number*. -*bp_number* is an integer and *cond* is an zsh expression to be evaluated whenever +*bp_number* is an integer and *cond* is an bash expression to be evaluated whenever breakpoint *bp_number* is reached. Examples: diff --git a/command/next.sh b/command/next.sh index e60d44ad..4160d99e 100644 --- a/command/next.sh +++ b/command/next.sh @@ -24,14 +24,17 @@ # but the command is different. _Dbg_help_add next \ -"**next** [*count*] +"**next** [ **+** | **-** ] [ *count* ] -Single step an statement skipping functions. This is sometimes called +Step one statement ignoring steps into function calls at this level. This is sometimes called 'step over' or 'step through'. -If *count* is given, stepping occurs that many times before -stopping. Otherwise *count* is one. *count* an be an arithmetic -expression. +With an integer argument, perform ``next`` that many times. + +A suffix of ``+`` on the command or an alias to the command forces to +move to another line, while a suffix of ``-`` does the opposite and +disables the requiring a move to a new line. If no suffix is given, +the debugger setting 'different-line' determines this behavior. Functions and source'd files are not traced. This is in contrast to **step**. diff --git a/command/skip.sh b/command/skip.sh index f310ec57..0e4b15aa 100644 --- a/command/skip.sh +++ b/command/skip.sh @@ -1,7 +1,8 @@ # -*- shell-script -*- # gdb-like "skip" (step over) commmand. # -# Copyright (C) 2010, 2011, 2017 Rocky Bernstein +# Copyright (C) 2010, 2011, 2017, 2024 +# Rocky Bernstein # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -45,7 +46,7 @@ See http://lists.gnu.org/archive/html/bug-bash/2017-04/msg00004.html See also: --------- -**next** and **step**. +**next**, **step**, and **continue**. " _Dbg_do_skip() { diff --git a/command/step.sh b/command/step.sh index 8d2e7e77..8c703e70 100644 --- a/command/step.sh +++ b/command/step.sh @@ -1,7 +1,7 @@ # -*- shell-script -*- # step.sh - Debugger step ("step into") commmand. # -# Copyright (C) 2006, 2008, 2009, 2010, 2015 +# Copyright (C) 2006, 2008, 2009, 2010, 2015, # 2024 Rocky Bernstein rocky@gnu.org # # This program is free software; you can redistribute it and/or @@ -27,10 +27,9 @@ typeset -i _Dbg_set_different=0 _Dbg_help_add step \ -"**step** [*count*] - -Single step an statement. This is sometimes called 'step into'. +"**step** [ **+** | **-** [ *count* ]] +Single step a statement. This is sometimes called 'step into'. If *count* is given, stepping occurs that many times before stopping. Otherwise *count* is one. *count* an be an arithmetic @@ -44,12 +43,19 @@ into. If suffix \"-\" is added, the different line aspect of \"step+\" does not occur. -With no suffix is given, the behavior is dicted by the setting of **set force**. +With no suffix is given, the behavior is dictated by the setting of **set different**. + +Examples: +--------- + + step # step 1 + step 1 # same as above + step 5/5+0 # same as above See also: --------- -**next**, **skip**, and **set force**." 1 +**next**, **skip**, **continue**, and **set different**." 1 # Step command diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..7fa3a6ec --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,3 @@ +*~ +/.python-version +/_build diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..18a6d29c --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,26 @@ +# Minimal makefile for Sphinx documentation +# We use "remake" target comments +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = python -msphinx +SPHINXPROJ = bashdb +SOURCEDIR = . +BUILDDIR = _build + +# Put "help" first so that "make" without argument is like "make help". +#: Give sphinx build help +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help docs all + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +#: build HTML documentation; Set $O can be for $SPHINXOPTS +all docs: Makefile + $(MAKE) html diff --git a/docs/commands.rst b/docs/commands.rst new file mode 100644 index 00000000..89d01d35 --- /dev/null +++ b/docs/commands.rst @@ -0,0 +1,19 @@ +Command Reference +***************** + +Following *gdb*, we classify commands into categories. Note though +that some commands, like `quit`, and `restart`, are in different categories +and some categories are new, like `set`, `show`, and `info`. + +.. toctree:: + :maxdepth: 1 + + commands/breakpoints + commands/data + commands/files + commands/info + commands/running + commands/set + commands/stack + commands/show + commands/support diff --git a/docs/commands/Makefile b/docs/commands/Makefile new file mode 100644 index 00000000..401c953a --- /dev/null +++ b/docs/commands/Makefile @@ -0,0 +1,9 @@ +# Whatever it is you want to do, it should be handled by the +# by the main (parent) Makefile. So reissue make from there. +.PHONY: html + +html: + $(MAKE) -C .. $@ + +%: html + $(MAKE) -C .. $@ diff --git a/docs/commands/breakpoints.rst b/docs/commands/breakpoints.rst new file mode 100644 index 00000000..24b44afe --- /dev/null +++ b/docs/commands/breakpoints.rst @@ -0,0 +1,56 @@ +Breakpoints +=========== + +Making the program stop at certain points + +A *breakpoint* can make your program stop at that point. You can set +breakpoints with the break command and its variants. You can specify +the place where your program should stop by file and line number or by +function name. + +The debugger assigns a number to each breakpoint when you create it; +these numbers are successive integers starting with 1. In many of the +commands for controlling various features of breakpoints you use this +number. Each breakpoint may be enabled or disabled; if disabled, it +has no effect on your program until you enable it again. + +The debugger allows you to set any number of breakpoints at the same +place in your program. There is nothing unusual about this because +different breakpoints can have different conditions associated with +them. + +The simplest sort of breakpoint breaks every time your program reaches +a specified place. You can also specify a condition for a +breakpoint. A condition is just a Boolean expression in your +programming language. A breakpoint with a condition evaluates the +expression each time your program reaches it, and your program stops +only if the condition is true. + +This is the converse of using assertions for program validation; in +that situation, you want to stop when the assertion is violated-that +is, when the condition is false. + +Break conditions can have side effects, and may even call functions in +your program. This can be useful, for example, to activate functions +that log program progress, or to use your own print functions to +format special data structures. The effects are completely predictable +unless there is another enabled breakpoint at the same address. (In +that case, pydb might see the other breakpoint first and stop your +program without checking the condition of this one.) Note that +breakpoint commands are usually more convenient and flexible than +break conditions for the purpose of performing side effects when a +breakpoint is reached. + +Break conditions can be specified when a breakpoint is set, by adding +a comma in the arguments to the break command. They can also be +changed at any time with the :ref:`condition ` command. + +.. toctree:: + :maxdepth: 1 + + breakpoints/break + breakpoints/condition + breakpoints/delete + breakpoints/disable + breakpoints/enable + breakpoints/tbreak diff --git a/docs/commands/breakpoints/Makefile b/docs/commands/breakpoints/Makefile new file mode 100644 index 00000000..014a5f2e --- /dev/null +++ b/docs/commands/breakpoints/Makefile @@ -0,0 +1,9 @@ +# Whatever it is you want to do, it should be handled by the +# by the main (parent) Makefile. So reissue make from there. +.PHONY: html + +html: + $(MAKE) -C ../.. $@ + +%: html + $(MAKE) -C ../.. $@ diff --git a/docs/commands/breakpoints/break.rst b/docs/commands/breakpoints/break.rst new file mode 100644 index 00000000..13800939 --- /dev/null +++ b/docs/commands/breakpoints/break.rst @@ -0,0 +1,27 @@ +.. index:: break +.. _break: + +Set a Breakpoint (break) +------------------------ + +**break** [*loc-spec*] + +Set a breakpoint at loc-spec. + +If no location specification is given, use the current line. + +Multiple breakpoints at one place are permitted, and useful if conditional. + +Examples: ++++++++++ + +:: + + break # Break where we are current stopped at + break 10 # Break on line 10 of the file we are + # currently stopped at + break /etc/profile:10 # Break on line 45 of os.path + +.. seealso:: + + :ref:`tbreak `, :ref:`condition `, :ref:`delete `, :ref:`disable ` and :ref:`continue `. diff --git a/docs/commands/breakpoints/condition.rst b/docs/commands/breakpoints/condition.rst new file mode 100644 index 00000000..bc0d6904 --- /dev/null +++ b/docs/commands/breakpoints/condition.rst @@ -0,0 +1,24 @@ +.. index:: condition +.. _condition: + +Add Condition to a Breakpoint (condition) +----------------------------------------- + +**condition** *bp_number* *condition* + +*bp_number* is a breakpoint number. *condition* is a bash expression +which must evaluate to *True* before the breakpoint is honored. If +*condition* is absent, any existing condition is removed; i.e., the +breakpoint is made unconditional. + +Examples: ++++++++++ + +:: + + condition 5 x > 10 # Breakpoint 5 now has condition x > 10 + condition 5 # Remove above condition + +.. seealso:: + + :ref:`break `, :ref:`tbreak `. diff --git a/docs/commands/breakpoints/delete.rst b/docs/commands/breakpoints/delete.rst new file mode 100644 index 00000000..e25d7804 --- /dev/null +++ b/docs/commands/breakpoints/delete.rst @@ -0,0 +1,13 @@ +.. index:: delete +.. _delete: + +Remove Breakpoints (delete) +--------------------------- + +**delete** [*bpnumber* [*bpnumber*...]] + +Delete some breakpoints. + +Arguments are breakpoint numbers with spaces in between. To delete +all breakpoints, give no argument. Without +arguments, clear all breaks (but first ask confirmation). diff --git a/docs/commands/breakpoints/disable.rst b/docs/commands/breakpoints/disable.rst new file mode 100644 index 00000000..5b4ed99c --- /dev/null +++ b/docs/commands/breakpoints/disable.rst @@ -0,0 +1,14 @@ +.. index:: disable +.. _disable: + +Disable breakpoints (disable) +----------------------------- + +**disable** *bpnumber* [*bpnumber* ...] + +Disables the breakpoints given as a space separated list of breakpoint +numbers. See also `info break` to get a list. + +.. seealso:: + + :ref:`enable ` diff --git a/docs/commands/breakpoints/enable.rst b/docs/commands/breakpoints/enable.rst new file mode 100644 index 00000000..4a030e69 --- /dev/null +++ b/docs/commands/breakpoints/enable.rst @@ -0,0 +1,14 @@ +.. index:: enable +.. _enable: + +Enable Breakpoints (enable) +--------------------------- + +**enable** *bpnumber* [*bpnumber* ...] + +Enables the breakpoints given as a space separated list of breakpoint +numbers. See also `info break` to get a list. + +.. seealso:: + + :ref:`disable `, :ref:`tbreak ` diff --git a/docs/commands/breakpoints/tbreak.rst b/docs/commands/breakpoints/tbreak.rst new file mode 100644 index 00000000..cae19ce1 --- /dev/null +++ b/docs/commands/breakpoints/tbreak.rst @@ -0,0 +1,30 @@ +.. index:: tbreak +.. _tbreak: + +Set a Temporary Breakpoint (tbreak) +----------------------------------- + +**tbreak** [ *location* ] [**if** *condition*] + +With a line number argument, set a break there in the current file. +With a function name, set a break at first executable line of that +function. Without argument, set a breakpoint at current location. If +a second argument is `if`, subsequent arguments given an expression +which must evaluate to true before the breakpoint is honored. + +The location line number may be prefixed with a filename or module +name and a colon. + +Examples: ++++++++++ + +:: + + tbreak # Break where we are current stopped at + tbreak 10 # Break on line 10 of the file we are currently stopped at + tbreak /etc/profile:10 # Break on line 10 of /etc/default + tbreak myfile:45 # Use relative file name + +.. seealso:: + + :ref:`break `, :ref:`condition `, :ref:`delete `. diff --git a/docs/commands/data.rst b/docs/commands/data.rst new file mode 100644 index 00000000..56c25b70 --- /dev/null +++ b/docs/commands/data.rst @@ -0,0 +1,13 @@ +Data +==== + +Examining data. + +.. toctree:: + :maxdepth: 1 + + data/display + data/eval + data/examine + data/load + data/undisplay diff --git a/docs/commands/data/display.rst b/docs/commands/data/display.rst new file mode 100644 index 00000000..f19d8c33 --- /dev/null +++ b/docs/commands/data/display.rst @@ -0,0 +1,25 @@ +.. index:: display +.. _display: + +Set a Display Expression (``display``) +-------------------------------------- + +**display** [*stmt*] + +Evaluate *stmt* each time the debugger is stopped. If *stmt* is omitted, evaluate +all of the display statements that are active. In contrast, **info display** +shows the display statements without evaluating them. + +Examples: ++++++++++ + +:: + + display echo $x # show the current value of x each time debugger stops + display # evaluate all display statements + + +.. seealso:: + + :ref:`undisplay ` to cancel display requests previously made, and + `info display `. diff --git a/docs/commands/data/eval.rst b/docs/commands/data/eval.rst new file mode 100644 index 00000000..2284f9ee --- /dev/null +++ b/docs/commands/data/eval.rst @@ -0,0 +1,52 @@ +.. index:: eval +.. _eval: + +Evaluate a Bash Expression (``eval``) +------------------------------------- + +**eval** *cmd* + +**eval** + +**eval?** + +In the first form *cmd* is a string; *cmd* is a string sent to special +shell builtin *eval*. + +In the second form, use evaluate the current source line text. + +Often when one is stopped at the line of the first part of an "if", "elif", "case", "return", +"while" compound statement or an assignment statement, one wants to eval is just the expression +portion. For this, use eval?. Actually, any alias that ends in ? which is aliased to eval will +do the same thing. + +Run *cmd* in the context of the current frame. + +If no string is given, we run the string from the current source code +about to be run. If the command ends `?` (via an alias) and no string is +given, the following translations occur: + +:: + + {if|elif} [; then] => + while [; do]? => + return => + = => + +The above is done via regular expression matching. No fancy parsing is +done, say, to look to see if *expr* is split across a line or whether +var an assignment might have multiple variables on the left-hand side. + +Examples: ++++++++++ + +:: + + eval 1+2 # 3 + eval # Run current source-code line + eval? # but strips off leading 'if', 'while', .. + # from command + +.. seealso:: + + :ref:`set autoeval ` and :ref:`examine `. diff --git a/docs/commands/data/examine.rst b/docs/commands/data/examine.rst new file mode 100644 index 00000000..c88d4c0b --- /dev/null +++ b/docs/commands/data/examine.rst @@ -0,0 +1,28 @@ +.. index:: examine +.. _examine: + +Print the value of an expression (``examine``) +---------------------------------------------- + +**examine** *expr1* + +Print value of an expression via typeset, let, and failing these, eval. + +Single variables and arithmetic expressions do not need leading ``$`` for +their value is to be substituted. However if neither these, variables +need ``$`` to have their value substituted. + +In contrast to normal bash expressions, expressions should not have +blanks which would cause bash to see them as different tokens. + +Examples: ++++++++++ + +:: + + examine x+1 # ok + examine x + 1 # not ok + +.. seealso:: + + :ref:`eval `. diff --git a/docs/commands/data/load.rst b/docs/commands/data/load.rst new file mode 100644 index 00000000..0afd4b98 --- /dev/null +++ b/docs/commands/data/load.rst @@ -0,0 +1,13 @@ +.. index:: load +.. _load: + +Read in a Bash Script (``load``) +--------------------------------- + +**load** *bash-script* + +Read in lines of a *bash-script*. + +.. seealso:: + + :ref:`info files `. diff --git a/docs/commands/data/undisplay.rst b/docs/commands/data/undisplay.rst new file mode 100644 index 00000000..87e5ad4e --- /dev/null +++ b/docs/commands/data/undisplay.rst @@ -0,0 +1,17 @@ +.. index:: undisplay +.. _undisplay: + +Cancel a Display Expression (undisplay) +--------------------------------------- + +**undisplay** *display-number*... + +Cancel some expressions to be displayed when program stops. +Arguments are the code numbers of the expressions to stop displaying. + +No argument cancels all automatic-display expressions and is +the same as `delete display`. + +.. seealso:: + + :ref:`info display ` to see current list of display expressions diff --git a/docs/commands/files.rst b/docs/commands/files.rst new file mode 100644 index 00000000..67026a1a --- /dev/null +++ b/docs/commands/files.rst @@ -0,0 +1,10 @@ +Files +===== + +Specifying and examining files. + +.. toctree:: + :maxdepth: 1 + + files/edit + files/list diff --git a/docs/commands/files/edit.rst b/docs/commands/files/edit.rst new file mode 100644 index 00000000..0c6a9ea5 --- /dev/null +++ b/docs/commands/files/edit.rst @@ -0,0 +1,14 @@ +.. index:: edit +.. _edit: + +Edit a file (`edit`) +-------------------- + +**edit** *position* + +Edit specified file or module. +With no argument, edits file containing most recent line listed. + +.. seealso:: + + :ref:`list ` diff --git a/docs/commands/files/list.rst b/docs/commands/files/list.rst new file mode 100644 index 00000000..3c52be4c --- /dev/null +++ b/docs/commands/files/list.rst @@ -0,0 +1,54 @@ +.. index:: list +.. _list: + +List Zsh Source Code (`list`) +----------------------------- + +**list**[**>**] [ *location*|**.**|**-** [ *num* ]] + +**list** *location* [*num*] + +List source code. + +Without arguments, print lines centered around the current line. If +*num* is given that number of lines is shown. + +If this is the first `list` command issued since the debugger command +loop was entered, then the current line is the current frame. If a +subsequent list command was issued with no intervening frame changing, +then that is start the line after we last one previously shown. + +A *location* is either: + +* a number, e.g. 5, +* a filename, colon, and a number, e.g. `/etc/profile:5`, +* a "." for the current line number +* a "-" for the lines before the current linenumber + +If the location form is used with a subsequent parameter, the +parameter is the starting line number is used. When there two numbers +are given, the last number value is treated as a stopping line unless +it is less than the start line, in which case it is taken to mean the +number of lines to list instead. + +Wherever a number is expected, it does not need to be a constant -- +just something that evaluates to a positive integer. + +Examples: ++++++++++ + +:: + + list 5 # List starting from line 5 + list 4+1 # Same as above. + list /etc/profile:5 # List starting from line 5 of /etc/profile + list /etc/profile 5 # Same as above. + list /etc/profile 5 6 # list lines 5 and 6 of /etc/profile + list /etc/profile 5 2 # Same as above, since 2 < 5. + list profile:5 2 # List two lines starting from line 5 of profile + list . # List lines centered from where we currently are stopped + list - # List lines previous to those just shown + +.. seealso:: + + :ref:`set listize `, or :ref:`show listsize ` to see or set the number of source-code lines to list. diff --git a/docs/commands/info.rst b/docs/commands/info.rst new file mode 100644 index 00000000..bfe65fa4 --- /dev/null +++ b/docs/commands/info.rst @@ -0,0 +1,24 @@ +Info +==== + +**info** [ *info-subcommand* ] + +Get information on the program being debugged. + +You can give unique prefix of the name of a subcommand to get +information about just that subcommand. + +Type `info` for a list of info subcommands and what they do. Type ``help info`` for a summary list of info subcommands. + +.. toctree:: + :maxdepth: 1 + + info/breakpoints + info/display + info/files + info/functions + info/line + info/program + info/source + info/stack + info/variables diff --git a/docs/commands/info/Makefile b/docs/commands/info/Makefile new file mode 100644 index 00000000..014a5f2e --- /dev/null +++ b/docs/commands/info/Makefile @@ -0,0 +1,9 @@ +# Whatever it is you want to do, it should be handled by the +# by the main (parent) Makefile. So reissue make from there. +.PHONY: html + +html: + $(MAKE) -C ../.. $@ + +%: html + $(MAKE) -C ../.. $@ diff --git a/docs/commands/info/breakpoints.rst b/docs/commands/info/breakpoints.rst new file mode 100644 index 00000000..584686a0 --- /dev/null +++ b/docs/commands/info/breakpoints.rst @@ -0,0 +1,36 @@ +.. index:: info; breakpoints +.. _info_breakpoints: + +Info Breakpoints +---------------- + +**info breakpoints** [ *bp-number...* ] + +Show status of user-settable breakpoints. If no breakpoint numbers are +given, the show all breakpoints. Otherwise only those breakpoints +listed are shown and the order given. + +The columns in a line show are as follows: + +* The \"Num\" column is the breakpoint number which can be used in `condition`, `delete`, `disable`, `enable` commands. +* The \"Disp\" column contains one of \"keep\", \"del\", the disposition of the breakpoint after it gets hit. +* The \"enb\" column indicates whether the breakpoint is enabled. +* The \"Where\" column indicates where the breakpoint is located. + +Example: +++++++++ + +:: + + bashdb<4> info breakpoints + Num Type Disp Enb What + 1 breakpoint keep n /etc/profile:8 + 2 breakpoint keep y /etc/profile:10 + stop only if [[ ${PS1-} ]] + + +Show breakpoints. + +.. seealso:: + + :ref:`break `, :ref:`condition `, :ref:`delete `, :ref:`enable `, and ref:`disable ` diff --git a/docs/commands/info/display.rst b/docs/commands/info/display.rst new file mode 100644 index 00000000..6616970d --- /dev/null +++ b/docs/commands/info/display.rst @@ -0,0 +1,13 @@ +.. index:: info; display +.. _info_display: + +Info Display +------------ + +**info display** + +Show all display expressions. + +.. seealso:: + + :ref:`display` diff --git a/docs/commands/info/files.rst b/docs/commands/info/files.rst new file mode 100644 index 00000000..cfd92a58 --- /dev/null +++ b/docs/commands/info/files.rst @@ -0,0 +1,13 @@ +.. index:: info; files +.. _info_files: + +Info Files +------------ + +**info files** + +Show a list of files that have been read in and properties regarding them. + +.. seealso:: + + :ref:`load` diff --git a/docs/commands/info/functions.rst b/docs/commands/info/functions.rst new file mode 100644 index 00000000..a73dff5f --- /dev/null +++ b/docs/commands/info/functions.rst @@ -0,0 +1,23 @@ +.. index:: info; functions +.. _info_functions: + +Info Functions +-------------- + +**info functions** [*string-pattern*] + +List function names. If *string-pattern* is given, the results +are filtered using the shell ``=`` (or ``==``) test. +list global and static variable names. + +Examples: ++++++++++ + +:: + + info functions # show all functions + info functions co # show all functions with "co" in the name + +.. seealso:: + + :ref:`info line `, and :ref:`info program `. diff --git a/docs/commands/info/line.rst b/docs/commands/info/line.rst new file mode 100644 index 00000000..3cb8445c --- /dev/null +++ b/docs/commands/info/line.rst @@ -0,0 +1,21 @@ +.. index:: info; line +.. _info_line: + +Info Line +--------- + +**info line** + +Show information about the current line. + +Example: +++++++++ + +:: + + bashdb<1> info line + Line 4 of "/etc/profile" + +.. seealso:: + + :ref:`info program `, :ref:`info source ` diff --git a/docs/commands/info/program.rst b/docs/commands/info/program.rst new file mode 100644 index 00000000..2876ba68 --- /dev/null +++ b/docs/commands/info/program.rst @@ -0,0 +1,28 @@ +.. index:: info; program +.. _info_program: + +Info Program +------------ + +**info program** + +Execution status of the program. Listed are: + +* Reason the program is stopped. +* The next line to be run + +Example: +++++++++ + +:: + + bashdb<1> info program + Program stopped. + It stopped after being stepped. + Next statement to be run is: + [ "${PS1-}" ] + + +.. seealso:: + + :ref:`info line `, and :ref:`info source `. diff --git a/docs/commands/info/source.rst b/docs/commands/info/source.rst new file mode 100644 index 00000000..32df1cc1 --- /dev/null +++ b/docs/commands/info/source.rst @@ -0,0 +1,23 @@ +.. index:: info; source +.. _info_source: + +Info Source +----------- + +**info source** + +Information about the current bash script file. + +Example: +++++++++ + +:: + + bashdb<1> info source + Current script file is /etc/profile + Located in /etc/profile + Contains 27 lines. + +.. seealso:: + + :ref:`info program `, :ref:`info files `, and :ref:`info line `. diff --git a/docs/commands/info/stack.rst b/docs/commands/info/stack.rst new file mode 100644 index 00000000..92364901 --- /dev/null +++ b/docs/commands/info/stack.rst @@ -0,0 +1,13 @@ +.. index:: info; stack +.. _info_stack: + +Info Stack +----------- + +**info stack** + +An alias for **backtrace** + +.. seealso:: + + :ref:`backtrace ` diff --git a/docs/commands/info/variables.rst b/docs/commands/info/variables.rst new file mode 100644 index 00000000..56985f1b --- /dev/null +++ b/docs/commands/info/variables.rst @@ -0,0 +1,30 @@ +.. index:: info; variables +.. _info_variables: + +Info Variables +---------------- + +**info variables [**-i**|**--integer**][**-r**|**--readonly**][**-x**|**--exports**][**-a**|**--indexed**][**-A*|**--associative**][**-t**|**--trace**][**-p**|**--properties**] + +list global and local variable names. + +Options: + + -i | --exports restricted to integer variables + -r | --readonly restricted to read-only variables + -x | --exports restricted to exported variables + -a | --indexed restricted to indexed array variables + -A | --associative restricted to associative array variables + -t | --trace restricted to traced variables + -p | --properties display properties of variables as printed by declare -p + + +Examples: ++++++++++ + +:: + + info variables # show all variables + info variables -p # show all variables with their properties + info variables -r # show only read-only variables + info variables -i # show only integer variables diff --git a/docs/commands/running.rst b/docs/commands/running.rst new file mode 100644 index 00000000..1bc53e49 --- /dev/null +++ b/docs/commands/running.rst @@ -0,0 +1,25 @@ +Running +======= + +Running, restarting, or stopping the program. + +When a program is stopped there are several possibilities for further +program execution. You can: + +* terminate the program inside the debugger +* restart the program +* continue its execution until it would normally terminate or until a + breakpoint is hit +* step execution which is runs for a limited amount of code before stopping + +.. toctree:: + :maxdepth: 1 + + running/continue + running/debug + running/kill + running/next + running/quit + running/run + running/skip + running/step diff --git a/docs/commands/running/continue.rst b/docs/commands/running/continue.rst new file mode 100644 index 00000000..4bf9347e --- /dev/null +++ b/docs/commands/running/continue.rst @@ -0,0 +1,26 @@ +.. index:: continue +.. _continue: + +Continue Program Execution (`continue`) +--------------------------------------- + +**continue** [ *loc* | **-*** ] + +If *loc* or *-* is not given, continue until the next breakpoint or +the end of program is reached. If **-** is given, then debugging will +be turned off after continuing causing your program to run at full +speed. + +If **loc** is given, a temporary breakpoint is set at the location. + +Examples: ++++++++++ + +:: + + continue # Continue execution + continue 5 # Continue with a one-time breakpoint at line 5 + +.. seealso:: + + :ref:`next ` :ref:`skip `, and :ref:`step ` provide other ways to progress execution. diff --git a/docs/commands/running/debug.rst b/docs/commands/running/debug.rst new file mode 100644 index 00000000..f5b840f3 --- /dev/null +++ b/docs/commands/running/debug.rst @@ -0,0 +1,17 @@ +.. index:: debug +.. _debug: + +Recursive Debugging (``debug``) +------------------------------- + +**debug** [*bash-script* [*args*...]] + +Recursively debug into *bash-script*. + +If *script* is not given, take the script name from the command that +is about to be executed. Note that when the nested debug finished, you +are still where you were prior to entering the debugger. + +.. seealso:: + + :ref:`skip `, and :ref:`run ` diff --git a/docs/commands/running/kill.rst b/docs/commands/running/kill.rst new file mode 100644 index 00000000..a8a680d7 --- /dev/null +++ b/docs/commands/running/kill.rst @@ -0,0 +1,41 @@ +.. index:: kill +.. _kill: + +Send Kill Signal (``kill``) +--------------------------- + +**kill** [ *signal-number* ] + +**kill!** [*signal-number*] + +Send this process a POSIX signal ('9' for 'SIGKILL' or ``kill -SIGKILL``) + +9 is a non-maskable interrupt that terminates the program. If program +is threaded it may be expedient to use this command to terminate the program. + +However other signals, such as 15 or ``INT`` that allow for the debugged to +handle them can be sent. + +Giving a negative number is the same as using its positive value. + +When the ! suffix appears, no confirmation is needed. + +Examples: ++++++++++ + +:: + + kill # non-interuptable, nonmaskable kill + kill 9 # same as above + kill -9 # same as above + kill 15 # nicer, maskable TERM signal + kill! 15 # same as above, but no confirmation + kill -INT # same as above + kill -SIGINT # same as above + kill -WINCH # send "window change" signal + kill -USR1 # send "user 1" signal + +.. seealso:: + + :ref:`quit ` for less a forceful termination command, :ref:`run ` restarts the debugged program. + Also similar is the `signal ` command. diff --git a/docs/commands/running/next.rst b/docs/commands/running/next.rst new file mode 100644 index 00000000..04002026 --- /dev/null +++ b/docs/commands/running/next.rst @@ -0,0 +1,25 @@ +.. index:: next +.. _next: + +Step Over (``next``) +-------------------- + +**next** [ **+** | **-** ] [ *count* ] + +Step one statement ignoring steps into function calls at this level. This is sometimes called +'step over' or 'step through'. + +With an integer argument, perform ``next`` that many times. + +A suffix of ``+`` on the command or an alias to the command forces to +move to another line, while a suffix of ``-`` does the opposite and +disables the requiring a move to a new line. If no suffix is given, +the debugger setting 'different-line' determines this behavior. + +Functions and source'd files are not traced. This is in contrast to +``step``. + +.. seealso:: + + :ref:`skip `, `step `, and :ref:`continue ` provide other ways to progress execution. + :ref:`set different ` sets the default stepping behavior. diff --git a/docs/commands/running/quit.rst b/docs/commands/running/quit.rst new file mode 100644 index 00000000..555e857e --- /dev/null +++ b/docs/commands/running/quit.rst @@ -0,0 +1,16 @@ +.. index:: quit +.. _quit: + +Gentle Termination (`quit`) +--------------------------- + +**quit** [*exit-code* [*shell-levels*]] + +The program being debugged is aborted. If *exit-code* is given, then +that will be the exit return code. If *shell-levels* is given, then up +to that many nested shells are quit. However to be effective, the last +of those shells should have been run under the debugger. + +.. seealso:: + + :ref:`kill ` or `kill` for more forceful termination commands. :ref:`run ` restarts the debugged program. diff --git a/docs/commands/running/run.rst b/docs/commands/running/run.rst new file mode 100644 index 00000000..45dc2395 --- /dev/null +++ b/docs/commands/running/run.rst @@ -0,0 +1,13 @@ +.. index:: run +.. _run: + +Restart Program (`run`) +----------------------- + +**run** [*args*] + +Attempt to restart the program. + +.. seealso:: + + :ref:`quit `, or :ref:`kill ` for termination commands, or :ref:`set args ` for another way to set run arguments. diff --git a/docs/commands/running/skip.rst b/docs/commands/running/skip.rst new file mode 100644 index 00000000..9c3de755 --- /dev/null +++ b/docs/commands/running/skip.rst @@ -0,0 +1,32 @@ +.. index:: skip +.. _skip: + +Skip over statement (``skip``) +------------------------------ + +**skip** [ *count* ] + +Skip over (don't run) the next *count* command(s). + +If *count* is given, stepping occurs that many times before +stopping. Otherwise *count* is one. *count* can be an arithmetic +expression. + +Note that skipping doesn't change the value of \$?. This has +consequences in some compound statements that test on \$?. For example +in: + +:: + + if grep foo bar.txt ; then + echo not skipped + fi + +Skipping the *if* statement will, in effect, skip running the *grep* +command. Since the return code is 0 when skipped, the *if* body is +entered. Similarly the same thing can happen in a *while* statement +test. + +.. seealso:: + + :ref:`next `, :ref:`step `, and :ref:`continue ` provide other ways to progress execution. diff --git a/docs/commands/running/step.rst b/docs/commands/running/step.rst new file mode 100644 index 00000000..60738abf --- /dev/null +++ b/docs/commands/running/step.rst @@ -0,0 +1,37 @@ +.. index:: step +.. _step: + +Step Into (`step`) +------------------ + +**step** [ **+** | **-** [ *count* ]] + +Single step a statement. This is sometimes called 'step into'. + +If *count* is given, stepping occurs that many times before +stopping. Otherwise *count* is one. *count* an be an arithmetic +expression. + +If suffix \"+\" is added, we ensure that the file and line position is +different from the last one just stopped at. + +However in contrast to \"next\", functions and source'd files are stepped +into. + +If suffix \"-\" is added, the different line aspect of \"step+\" does not occur. + +With no suffix is given, the behavior is dictated by the setting of **set different**. + +Examples: ++++++++++ + +:: + + step # step 1 + step 1 # same as above + step 5/5+0 # same as above + +.. seealso:: + + :ref:`next ` command. :ref:`skip `, and :ref:`continue ` provide other ways to progress execution. + :ref:`set different ` sets the default stepping behavior. diff --git a/docs/commands/set.rst b/docs/commands/set.rst new file mode 100644 index 00000000..dd886da6 --- /dev/null +++ b/docs/commands/set.rst @@ -0,0 +1,38 @@ +.. _set: + +**set** [ *set-subcommand* ] + +Modifies parts of the debugger environment. + +You can give unique prefix of the name of a subcommand to get information about just that subcommand. + +Type `set` for a list of set subcommands and what they do. Type ``help set`` +for a summary list of set subcommands. + +All of the "set" commands have a corresponding :ref:`show ` command. + +Set +=== + +Modifies parts of the debugger environment. You can see these +environment settings with the :ref:`show ` command. + +.. toctree:: + :maxdepth: 1 + + set/annotate + set/args + set/autoeval + set/autolist + set/basename + set/confirm + set/debug + set/different + set/editing + set/filename-display + set/highlight + set/linetrace + set/listsize + set/style + set/trace-commands + set/width diff --git a/docs/commands/set/annotate.rst b/docs/commands/set/annotate.rst new file mode 100644 index 00000000..c37226d1 --- /dev/null +++ b/docs/commands/set/annotate.rst @@ -0,0 +1,19 @@ +.. index:: set; annotate +.. _set_annotate: + +Set GNU Emacs annotation Level (`set annotation`) +------------------------------------------------- + +**set annotate** { **0** | **1** } + +Set annotation level. This is a (mostly obsolete) gdb setting, but +it is used in GNU Emacs. + +:: + + 0 - normal + 1 - fullname (for use when running under GNU Emacs). + +.. seealso:: + + :ref:`show annotate ` diff --git a/docs/commands/set/args.rst b/docs/commands/set/args.rst new file mode 100644 index 00000000..7ee0743a --- /dev/null +++ b/docs/commands/set/args.rst @@ -0,0 +1,14 @@ +.. index:: set; args +.. _set_args: + +Set Command Invocation Parameters (`set args`) +---------------------------------------------- + +**set args** [*script-args*] + +Set argument list to give program being debugged when it is started. +Follow this command with any number of args, to be passed to the program. + +.. seealso:: + + :ref:`run ` diff --git a/docs/commands/set/autoeval.rst b/docs/commands/set/autoeval.rst new file mode 100644 index 00000000..4339835b --- /dev/null +++ b/docs/commands/set/autoeval.rst @@ -0,0 +1,32 @@ +.. index:: set; autoeval +.. _set_autoeval: + +Auto-Evaluation of Unrecognized Debugger Commands (`set auto eval`) +------------------------------------------------------------------- + +**set autoeval** [ **on** | **off** ] + +Evaluate unrecognized debugger commands. + +Often inside the debugger, one would like to be able to run arbitrary +bash commands without having to preface expressions with +``print`` or ``eval``. Setting *autoeval* on will cause unrecognized +debugger commands to be *eval*'d as a bash expression. + +Note that if this is set, on error the message shown on type a bad +debugger command changes from: + +:: + + Undefined command: "fdafds". Try "help". + +to something more bash-eval-specific such as: + +:: + + /tmp/bashdb_eval_26397:2: command not found: fdafds + + +.. seealso:: + + :ref:`show autoeval ` diff --git a/docs/commands/set/autolist.rst b/docs/commands/set/autolist.rst new file mode 100644 index 00000000..039105a5 --- /dev/null +++ b/docs/commands/set/autolist.rst @@ -0,0 +1,47 @@ +.. index:: set; autolist +.. _set_autolist: + +List Statements on Debugger Entry (`set auto list`) +--------------------------------------------------- + +**set autolist** [ **on** | **off** ] + +Run the :ref:`list ` command every time you stop in the +debugger. + +With this, you will get output like: + +:: + + bashdb<0> set autolist on + Auto run of 'list' command is on. + bashdb<1> s + (/etc/profile:20): + 20: if [ -d /etc/profile.d ]; then + 15: PS1='$ ' + 16: fi + 17: fi + 18: fi + 19: + 20: => if [ -d /etc/profile.d ]; then + 21: for i in /etc/profile.d/*.sh; do + 22: if [ -r $i ]; then + 23: . $i + 24: fi + bashdb<2> s + (/etc/profile:21): + 21: for i in /etc/profile.d/*.sh; do + 16: fi + 17: fi + 18: fi + 19: + 20: if [ -d /etc/profile.d ]; then + 21: => for i in /etc/profile.d/*.sh; do + 22: if [ -r $i ]; then + 23: . $i + 24: fi + 25: done + +.. seealso:: + + :ref:`show autolist ` diff --git a/docs/commands/set/basename.rst b/docs/commands/set/basename.rst new file mode 100644 index 00000000..38fc13ab --- /dev/null +++ b/docs/commands/set/basename.rst @@ -0,0 +1,23 @@ +.. index:: set; basename +.. _set_basename: + +Basename Only in File Paths (`set basename`) +-------------------------------------------- + +**set basename** [ **on** | **off** ] + + +Set short filenames in debugger output. + +Setting this causes the debugger output to give just the basename for +filenames. This is useful in debugger testing or possibly showing +examples where you don't want to hide specific filesystem and +installation information. + +*This command is deprecated since gdb now has ``set filename-display`` which does the same thing.* + +So use ``set filename-display``. + +.. seealso:: + + :ref:`set filename-display `, :ref:`show basename ` diff --git a/docs/commands/set/confirm.rst b/docs/commands/set/confirm.rst new file mode 100644 index 00000000..b8c3f032 --- /dev/null +++ b/docs/commands/set/confirm.rst @@ -0,0 +1,18 @@ +.. index:: set; confirm +.. _set_confirm: + +Confirmation of Potentially Dangerous Operations (`set confirm`) +---------------------------------------------------------------- + +**set confirm** [ **on** | **off** ] + +Set confirmation of potentially dangerous operations. + +Some operations are a bit disruptive like terminating the program. +To guard against running this accidentally, by default we ask for +confirmation. Commands can also be exempted from confirmation by suffixing +them with an exclamation mark (!). + +.. seealso:: + + :ref:`show confirm ` diff --git a/docs/commands/set/debug.rst b/docs/commands/set/debug.rst new file mode 100644 index 00000000..f60869c6 --- /dev/null +++ b/docs/commands/set/debug.rst @@ -0,0 +1,17 @@ +.. index:: debug +.. _set_debug: + +Recursive Debugging (`debug`) +----------------------------- + +**debug** [*bash-script* [*args*...]] + +Recursively debug into *bash-script*. + +If *script* is not given, take the script name from the command that +is about to be executed. Note that when the nested debug finished, you +are still where you were prior to entering the debugger. + +.. seealso:: + + :ref:`skip `, and :ref:`run ` diff --git a/docs/commands/set/different.rst b/docs/commands/set/different.rst new file mode 100644 index 00000000..b112048a --- /dev/null +++ b/docs/commands/set/different.rst @@ -0,0 +1,29 @@ +.. index:: set; different +.. _set_different: + +Consecutive Stops on Different File/Line Positions) (``set different``) +--------------------------------------------------------------------- + +**set different** [ **on** | **off** ] + +Set consecutive stops must be on different file/line positions. + +By default, the debugger traces all events possible including line, +exceptions, call and return events. Just this alone may mean that for +any given source line several consecutive stops at a given line may +occur. Independent of this, bash allows one to put several commands in +a single source line of code. When a programmer does this, it might be +because the programmer thinks of the line as one unit. + +One of the challenges of debugging is getting the granualarity of +stepping comfortable. Because of the above, stepping all events can +often be too fine-grained and annoying. By setting different on you can +set a more coarse-level of stepping which often still is small enough +that you won't miss anything important. + +Note that the ``step`` and ``next`` debugger commands have '+' and '-' +suffixes if you want to override this setting on a per-command basis. + +.. seealso:: + + :ref:`show different `. diff --git a/docs/commands/set/editing.rst b/docs/commands/set/editing.rst new file mode 100644 index 00000000..190c6ffe --- /dev/null +++ b/docs/commands/set/editing.rst @@ -0,0 +1,13 @@ +.. index:: set; editing +.. _set_editing: + +Readline editing of commands (`set editing`) +-------------------------------------------- + +**set editing** [ **on** | **off** | **emacs** | **vi** ] + +Readline editing of command lines. + +.. seealso:: + + :ref:`show editing ` diff --git a/docs/commands/set/filename-display.rst b/docs/commands/set/filename-display.rst new file mode 100644 index 00000000..0c87c5b8 --- /dev/null +++ b/docs/commands/set/filename-display.rst @@ -0,0 +1,20 @@ +.. index:: set; filename-display +.. _set_filename-display: + +How to display file names (`set filename-display`) +-------------------------------------------------- + +**set filename-display** [ **basename** | **absolute** ] + +Set how to display filenames. + +Setting this causes the debugger output to either the basename for +filenames or its full absolute path. + +The absolute path is useful in debugger testing or possibly showing +examples where you don't want to hide specific filesystem and +installation information. + +.. seealso:: + + :ref:`show filename-display ` diff --git a/docs/commands/set/highlight.rst b/docs/commands/set/highlight.rst new file mode 100644 index 00000000..a7888dce --- /dev/null +++ b/docs/commands/set/highlight.rst @@ -0,0 +1,44 @@ +.. index:: set; highlight +.. _set_highlight: + +Set whether to use Terminal Highlighting (`set highlight`) +---------------------------------------------------------- + +**set highlight** [ **reset** ] {**plain** | **light** | **dark** | **off**} + +Set whether we use terminal highlighting for ANSI 8-color terminals. Permissible values are: + +:plain: + no terminal highlighting +:off: + same as plain +:light: + terminal background is light (the default) +:dark: + terminal background is dark + +If the first argument is *reset*, we clear any existing color formatting +and recolor all source code output. + +A related setting is *style* which sets the Pygments style for terminal +that support, 256 colors. But even here, it is useful to set +the highlight to tell the debugger for bold and emphasized text what +values to use. + +Examples: ++++++++++ + +:: + + set highlight off # no highlight + set highlight plain # same as above + set highlight # same as above + set highlight dark # terminal has dark background + set highlight light # terminal has light background + set highlight reset light # clear source-code cache and + # set for light background + set highlight reset # clear source-code cache + +.. seealso:: + + :ref:`show highlight ` and :ref:`set style ` diff --git a/docs/commands/set/linetrace.rst b/docs/commands/set/linetrace.rst new file mode 100644 index 00000000..a76797e1 --- /dev/null +++ b/docs/commands/set/linetrace.rst @@ -0,0 +1,13 @@ +.. index:: set; linetrace +.. _set_linetrace: + +Set whether to trace executed lines (`set linetrace`) +----------------------------------------------------- + +**set linetrace** [ **on** | **off** ] + +Traces each sourceline before running it. + +.. seealso:: + + :ref:`show linetrace `. diff --git a/docs/commands/set/listsize.rst b/docs/commands/set/listsize.rst new file mode 100644 index 00000000..68bb293d --- /dev/null +++ b/docs/commands/set/listsize.rst @@ -0,0 +1,13 @@ +.. index:: set; listsize +.. _set_listsize: + +Set List Command Line Count (`set listsize`) +-------------------------------------------- + +**set listsize** *number-of-lines* + +Set the number lines printed in a :ref:`list ` command by default + +.. seealso:: + + :ref:`show listsize ` diff --git a/docs/commands/set/style.rst b/docs/commands/set/style.rst new file mode 100644 index 00000000..4e9b932a --- /dev/null +++ b/docs/commands/set/style.rst @@ -0,0 +1,28 @@ +.. index:: set; style +.. _set_style: + +Set whether to use Pygments in Formatting Listings (``set style``) +------------------------------------------------------------------ + +**set style** [*pygments-style*] + +Set the pygments style in to use in formatting text for a 256-color terminal. +Note: if your terminal doesn't support 256 colors, you may be better off +using `--highlight=plain` or `--highlight=dark` instead. To turn off styles +use `set style none`. + +To list the available pygments styles inside the debugger, omit the style name. + + +Examples: ++++++++++ + +:: + + set style monokai # use monokai style (a dark style) + set style # list all known pygments styles + set style off # turn off any pygments source mark up + +.. seealso:: + + :ref:`show style ` and :ref:`set highlight ` diff --git a/docs/commands/set/trace-commands.rst b/docs/commands/set/trace-commands.rst new file mode 100644 index 00000000..b64ba60c --- /dev/null +++ b/docs/commands/set/trace-commands.rst @@ -0,0 +1,13 @@ +.. index:: set; trace-commands +.. _set_trace-commands: + +Set whether line tracing is in effect (`set trace-commands`) +------------------------------------------------------------ + +**set trace-commands** [ **on** | **off** ] + +Set echoing lines read from debugger command files + +.. seealso:: + + :ref:`show trace-commands ` diff --git a/docs/commands/set/width.rst b/docs/commands/set/width.rst new file mode 100644 index 00000000..ea0100bc --- /dev/null +++ b/docs/commands/set/width.rst @@ -0,0 +1,13 @@ +.. index:: set; width +.. _set_width: + +Set Terminal Output Width (`set width`) +--------------------------------------- + +**set width** *number* + +Set the number of characters the debugger thinks are in a line. + +.. seealso:: + + :ref:`show width ` diff --git a/docs/commands/show.rst b/docs/commands/show.rst new file mode 100644 index 00000000..ed44fcd7 --- /dev/null +++ b/docs/commands/show.rst @@ -0,0 +1,31 @@ +.. _show: + +**show** [ *subcommand* ] + +A command for showing things about the debugger. You can give unique prefix of the name of a subcommand to get information about just that subcommand. +nn +Type `show` for a list of show subcommands and what they do. Type ``help show`` for a summary list of show subcommands. Many of the "show" +commands have a corresponding :ref:`set ` command. + +Show +==== + +.. toctree:: + :maxdepth: 1 + + show/aliases + show/annotate + show/args + show/autoeval + show/autolist + show/basename + show/confirm + show/different + show/editing + show/filename-display + show/highlight + show/linetrace + show/listsize + show/style + show/trace-commands + show/width diff --git a/docs/commands/show/Makefile b/docs/commands/show/Makefile new file mode 100644 index 00000000..014a5f2e --- /dev/null +++ b/docs/commands/show/Makefile @@ -0,0 +1,9 @@ +# Whatever it is you want to do, it should be handled by the +# by the main (parent) Makefile. So reissue make from there. +.PHONY: html + +html: + $(MAKE) -C ../.. $@ + +%: html + $(MAKE) -C ../.. $@ diff --git a/docs/commands/show/aliases.rst b/docs/commands/show/aliases.rst new file mode 100644 index 00000000..806f2f38 --- /dev/null +++ b/docs/commands/show/aliases.rst @@ -0,0 +1,18 @@ +.. index:: show; aliases +.. _show_aliases: + +Show Debugger Command Aliases (``show aliases``) +------------------------------------------------ + +**show aliases** [ *alias* ...| **\*** ] + +Show command aliases. If parameters are given a list of all aliases +and the command they run are printed. Alternatively one can list +specific alias names for the commands those specific aliases are +attached to. If instead of an alias "*" appears anywhere as an alias +then just a list of aliases is printed, not what commands they are +attached to. + +.. seealso:: + + :ref:`alias ` diff --git a/docs/commands/show/annotate.rst b/docs/commands/show/annotate.rst new file mode 100644 index 00000000..283e9ef5 --- /dev/null +++ b/docs/commands/show/annotate.rst @@ -0,0 +1,19 @@ +.. index:: show; annotate +.. _show_annotate: + +Show Annotate (GNU Emacs annotation level) +------------------------------------------ + +**show annotate** + +Show annotation level. This is a (mostly obsolete) gdb setting, but +it is used in GNU Emacs. + +:: + + 0 - normal + 1 - fullname (for use when running under GNU Emacs). + +.. seealso:: + + :ref:`set annotate ` diff --git a/docs/commands/show/args.rst b/docs/commands/show/args.rst new file mode 100644 index 00000000..b36aa14d --- /dev/null +++ b/docs/commands/show/args.rst @@ -0,0 +1,9 @@ +.. index:: show; args +.. _show_args: + +Show Program invocation Arguments (``show args``) +------------------------------------------------- + +**show args** + +Show the argument list to give debugged program when it is started diff --git a/docs/commands/show/autoeval.rst b/docs/commands/show/autoeval.rst new file mode 100644 index 00000000..4664826c --- /dev/null +++ b/docs/commands/show/autoeval.rst @@ -0,0 +1,13 @@ +.. index:: show; autoeval +.. _show_autoeval: + +Show whether to evaluation of unrecognized debugger commands (``show autoeval``) +-------------------------------------------------------------------------------- + +**show autoeval** + +Show whether *bash* evaluates of unrecognized debugger commands. + +.. seealso:: + + :ref:`set autoeval ` diff --git a/docs/commands/show/autolist.rst b/docs/commands/show/autolist.rst new file mode 100644 index 00000000..dec87a07 --- /dev/null +++ b/docs/commands/show/autolist.rst @@ -0,0 +1,13 @@ +.. index:: show; autolist +.. _show_autolist: + +Show whether list on entry is in effect (``show autolist``) +----------------------------------------------------------- + +**show autolist** + +Run a debugger ref:`list ` command automatically on debugger entry. + +.. seealso:: + + :ref:`set autolist ` diff --git a/docs/commands/show/basename.rst b/docs/commands/show/basename.rst new file mode 100644 index 00000000..31ac5b1b --- /dev/null +++ b/docs/commands/show/basename.rst @@ -0,0 +1,19 @@ +.. index:: show; basename +.. _show_basename: + +Show if path should have basename only (``show basename``) +---------------------------------------------------------- + +**show basename** + +Show whether filename basenames or full path names are shown. + +*This command is deprecated since gdb now has ``show filename-display`` which does the same thing.* + +So use ``show filename-display``. + +Note + +.. seealso:: + + :ref:`set filename-display `, ref:`set basename `, diff --git a/docs/commands/show/confirm.rst b/docs/commands/show/confirm.rst new file mode 100644 index 00000000..a0b1c8dc --- /dev/null +++ b/docs/commands/show/confirm.rst @@ -0,0 +1,13 @@ +.. index:: show; confirm +.. _show_confirm: + +Show whether to Confirm Potentially Dangerous Operations (``show confirm``) +--------------------------------------------------------------------------- + +**show confirm** + +Show confirmation of potentially dangerous operations + +.. seealso:: + + :ref:`show confirm ` diff --git a/docs/commands/show/different.rst b/docs/commands/show/different.rst new file mode 100644 index 00000000..6a5af63a --- /dev/null +++ b/docs/commands/show/different.rst @@ -0,0 +1,11 @@ +.. index:: show; different +.. _show_different: + +Show whether to stop on same file/line positions (``show different``) +--------------------------------------------------------------------- + +Show consecutive stops on different file/line positions. + +.. seealso:: + + :ref:`set different ` diff --git a/docs/commands/show/editing.rst b/docs/commands/show/editing.rst new file mode 100644 index 00000000..bcc2115e --- /dev/null +++ b/docs/commands/show/editing.rst @@ -0,0 +1,13 @@ +.. index:: show; editing +.. _show_editing: + +Show whether GNU readline editing is in effect (``show editing``) +----------------------------------------------------------------- + +**show editing** + +Show editing of command lines as they are typed. + +.. seealso:: + + :ref:`set editing ` diff --git a/docs/commands/show/filename-display.rst b/docs/commands/show/filename-display.rst new file mode 100644 index 00000000..3faa581b --- /dev/null +++ b/docs/commands/show/filename-display.rst @@ -0,0 +1,13 @@ +.. index:: show; filename-display +.. _show_filename-display: + +Show how file names are displayed (``show filename-display``) +------------------------------------------------------------- + +**show filename-display** + +Show whether filename basenames or full path names are shown. + +.. seealso:: + + :ref:`set filename-display ` diff --git a/docs/commands/show/highlight.rst b/docs/commands/show/highlight.rst new file mode 100644 index 00000000..b5d82074 --- /dev/null +++ b/docs/commands/show/highlight.rst @@ -0,0 +1,13 @@ +.. index:: show; highlight +.. _show_highlight: + +Show whether highlighting is used in output (``show highlight``) +---------------------------------------------------------------- + +**show highlight** + +Show whether we use terminal highlighting. + +.. seealso:: + + :ref:`set highlight ` diff --git a/docs/commands/show/linetrace.rst b/docs/commands/show/linetrace.rst new file mode 100644 index 00000000..73d498fa --- /dev/null +++ b/docs/commands/show/linetrace.rst @@ -0,0 +1,13 @@ +.. index:: show; linetrace +.. _show_linetrace: + +Show whether each sourceline is traced before running it (``show linetrace``) +----------------------------------------------------------------------------- + +**show linetrace** + +Show whether each sourceline is traced before running it. + +.. seealso:: + + :ref:`set linetrace ` diff --git a/docs/commands/show/listsize.rst b/docs/commands/show/listsize.rst new file mode 100644 index 00000000..365da7ff --- /dev/null +++ b/docs/commands/show/listsize.rst @@ -0,0 +1,13 @@ +.. index:: show; listsize +.. _show_listsize: + +Lines shown in source listing) (``show listsize``) +-------------------------------------------------- + +**show listsize** + +Show the number lines printed in a :ref:`list ` command by default + +.. seealso:: + + :ref:`set listsize ` diff --git a/docs/commands/show/style.rst b/docs/commands/show/style.rst new file mode 100644 index 00000000..3886dce6 --- /dev/null +++ b/docs/commands/show/style.rst @@ -0,0 +1,13 @@ +.. index:: show; style +.. _show_style: + +Show Pygments Formatting style in Listings (``show style``) +----------------------------------------------------------- + +**show style** *pygments-style* + +Show the pygments style used in formatting 256-color terminal text. + +.. seealso:: + + :ref:`set style ` and :ref:`show highlight ` diff --git a/docs/commands/show/trace-commands.rst b/docs/commands/show/trace-commands.rst new file mode 100644 index 00000000..81a58530 --- /dev/null +++ b/docs/commands/show/trace-commands.rst @@ -0,0 +1,13 @@ +.. index:: show; trace-commands +.. _show_trace-commands: + +Show whether line tracing in is effect (``show trace-commands``) +---------------------------------------------------------------- + +**show trace-commands** + +Show tracking commands before running them + +.. seealso:: + + :ref:`set trace-commands ` diff --git a/docs/commands/show/width.rst b/docs/commands/show/width.rst new file mode 100644 index 00000000..5ed738f2 --- /dev/null +++ b/docs/commands/show/width.rst @@ -0,0 +1,13 @@ +.. index:: show; width +.. _show_width: + +Show terminal Width (``show width``) +------------------------------------ + +**show width** + +Show the number of characters the debugger thinks are in a line. + +.. seealso:: + + :ref:`set width ` diff --git a/docs/commands/stack.rst b/docs/commands/stack.rst new file mode 100644 index 00000000..c696418a --- /dev/null +++ b/docs/commands/stack.rst @@ -0,0 +1,23 @@ +Stack +===== + +Examining the call stack. + +The call stack is made up of stack frames. The debugger assigns +numbers to stack frames counting from zero for the innermost +(currently executing) frame. + +At any time the debugger identifies one frame as the "selected" frame. +Variable lookups are done with respect to the selected frame. When +the program being debugged stops, the debugger selects the innermost +frame. The commands below can be used to select other frames by +number. + + +.. toctree:: + :maxdepth: 1 + + stack/backtrace + stack/frame + stack/up + stack/down diff --git a/docs/commands/stack/backtrace.rst b/docs/commands/stack/backtrace.rst new file mode 100644 index 00000000..b580f120 --- /dev/null +++ b/docs/commands/stack/backtrace.rst @@ -0,0 +1,24 @@ +.. index:: backtrace +.. _backtrace: + +Show call stack (`backtrace`) +----------------------------- + +**backtrace** [ *count* ] + +Print a stack trace, with the most recent frame first. With a +positive number, print at most that many entries. With a negative number +print the top entries minus that number. + +An arrow at the beginning of a line indicates the 'current frame'. The +current frame determines the context used for many debugger commands +such as expression evaluation or source-line listing. + +Examples: ++++++++++ + +:: + + backtrace # Print a full stack trace + backtrace 2 # Print only the top two entries + backtrace -1 # Print a stack trace except the initial (least recent) call. diff --git a/docs/commands/stack/down.rst b/docs/commands/stack/down.rst new file mode 100644 index 00000000..bf6d2bf0 --- /dev/null +++ b/docs/commands/stack/down.rst @@ -0,0 +1,19 @@ +.. index:: down +.. _down: + +Relative Frame Motion towards more-recent Frame (`down`) +-------------------------------------------------------- + +**down** [ *count* ] + +Move the current frame down in the stack trace (to a newer frame). 0 +is the most recent frame. If no count is given, move down 1. + +When you enter the debugger this command doesn't make a lot of sense +because you are at the most-recently frame. However if you issue +`down` and `frame` commands, this can change. + + +.. seealso:: + + :ref:`up ` and :ref:`frame `. diff --git a/docs/commands/stack/frame.rst b/docs/commands/stack/frame.rst new file mode 100644 index 00000000..54bd02fb --- /dev/null +++ b/docs/commands/stack/frame.rst @@ -0,0 +1,36 @@ +.. index:: frame +.. _frame: + +Absolute Target Frame Positioning (`frame`) +------------------------------------------- + +**frame** [ *frame-number* ] + +Change the current frame to frame *frame-number* if specified, or the +current frame, 0, if no frame number specified. + +If a thread name or thread number is given, change the current frame +to a frame in that thread. Dot (.) can be used to indicate the name of +the current frame the debugger is stopped in. + +A negative number indicates the position from the other or +least-recently-entered end. So `frame -1` moves to the oldest frame, +and `frame 0` moves to the newest frame. Any variable or expression +that evaluates to a number can be used as a position, however due to +parsing limitations, the position expression has to be seen as a single +blank-delimited parameter. That is, the expression `(5*3)-1` is okay +while `(5 * 3) - 1)` isn't. + +Examples: ++++++++++ + +:: + + frame # Set current frame at the current stopping point + frame 0 # Same as above + frame 5-5 # Same as above. Note: no spaces allowed in expression 5-5 + frame 1 # Move to frame 1. Same as: frame 0; up + +.. seealso:: + + :ref:`down `, :ref:`up `, :ref:`backtrace ` diff --git a/docs/commands/stack/up.rst b/docs/commands/stack/up.rst new file mode 100644 index 00000000..69e6a6d0 --- /dev/null +++ b/docs/commands/stack/up.rst @@ -0,0 +1,14 @@ +.. index:: up +.. _up: + +Relative Target Motion towards a less-recent Frame (`up`) +--------------------------------------------------------- + +**up** [*count*] + +Move the current frame up in the stack trace (to an older frame). 0 is +the most recent frame. If no count is given, move up 1. + +.. seealso:: + + :ref:`down ` and :ref:`frame `. diff --git a/docs/commands/support.rst b/docs/commands/support.rst new file mode 100644 index 00000000..7f5bc18a --- /dev/null +++ b/docs/commands/support.rst @@ -0,0 +1,10 @@ +Support +======= + +.. toctree:: + :maxdepth: 1 + + support/alias + support/help + support/source + support/unalias diff --git a/docs/commands/support/alias.rst b/docs/commands/support/alias.rst new file mode 100644 index 00000000..9b26978c --- /dev/null +++ b/docs/commands/support/alias.rst @@ -0,0 +1,27 @@ +.. index:: alias +.. _alias: + +Add Debugger Command Alias (`alias`) +------------------------------------ + +**alias** *alias-name* *debugger-command* + +Add alias *alias-name* for a debugger command *debugger-comand*. + +Add an alias when you want to use a command abbreviation for a command +that would otherwise be ambiguous. For example, by default we make ``s`` +be an alias of ``step`` to force it to be used. Without the alias, ``s`` +might be ``step``, ``show``, or ``set`` among others + +Examples: ++++++++++ + +:: + + alias cat list # "cat myprog.sh" is the same as "list myprog.sh" + alias s step # "s" is now an alias for "step". + # The above example is done by default. + +.. seealso:: + + :ref:`unalias ` and :ref:`show alias `. diff --git a/docs/commands/support/help.rst b/docs/commands/support/help.rst new file mode 100644 index 00000000..55430b6f --- /dev/null +++ b/docs/commands/support/help.rst @@ -0,0 +1,21 @@ +.. index:: help +.. _help: + +Command Documentation (`help`) +------------------------------ + +**help** [ *command* [ *subcommand* ]| *expression* ] + +Without argument, print the list of available debugger commands. + +When an argument is given, it is first checked to see if it is command +name. + +Some commands like `info`, `set`, and `show` can accept an +additional subcommand to give help just about that particular +subcommand. For example `help info line` give help about the +`line` subcommand of `info`. + +.. seealso:: + + :ref:`examine `. diff --git a/docs/commands/support/source.rst b/docs/commands/support/source.rst new file mode 100644 index 00000000..a6dd8275 --- /dev/null +++ b/docs/commands/support/source.rst @@ -0,0 +1,18 @@ +.. index:: source +.. _source: + +Read and Run Debugger Commands from a File (`source`) +----------------------------------------------------- + +**source** [ **-v** ][ **-Y** | **-N** ][ **-c** ] *file* + +Read debugger commands from a file named *file*. Optional *-v* switch +(before the filename) causes each command in *file* to be echoed as it +is executed. Option *-Y* sets the default value in any confirmation +command to be "yes" and *-N* sets the default value to "no". + +Note that the command startup file `.bashdbrc` is read automatically +via a *source* command the debugger is started. + +An error in any command terminates execution of the command file +unless option `-c` is given. diff --git a/docs/commands/support/unalias.rst b/docs/commands/support/unalias.rst new file mode 100644 index 00000000..3628ab51 --- /dev/null +++ b/docs/commands/support/unalias.rst @@ -0,0 +1,13 @@ +.. index:: unalias +.. _unalias: + +Remove Debugger Command Alias (`unalias`) +----------------------------------------- + +**unalias** *alias-name* + +Remove alias *alias-name*. + +.. seealso:: + + :ref:`alias `. diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..78a8cb5d --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# bashdb documentation build configuration file, created by +# sphinx-quickstart on Fri Sep 29 07:09:20 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.githubpages', + # 'numpydoc', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = ['.rst', 'md'] + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'bashdb' +copyright = '2017, 2019, 2023, 2024 Rocky Bernstein' +author = 'Rocky Bernstein' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.1.3' +# The full version, including alpha/beta/rc tags. +release = '1.1.3' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = "en" + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = [] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + 'donate.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'bashdbdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'bashdb.tex', 'bashdb Documentation', + 'Rocky Bernstein', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'bashdb', 'bashdb Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'bashdb', 'bashdb Documentation', + author, 'bashdb', 'gdb-like debugger for bash.', + 'Programming'), +] diff --git a/docs/entry-exit.rst b/docs/entry-exit.rst new file mode 100644 index 00000000..a875250b --- /dev/null +++ b/docs/entry-exit.rst @@ -0,0 +1,86 @@ +Entering the Bash Debugger +**************************** + +.. toctree:: +.. contents:: + + +Invoking the Debugger Initially +==================================== + +The simplest way to debug your program is to run ``bashdb``. Give +the name of your program and its options and any debugger options: + +.. code:: console + + $ cat /etc/profile + + if [ "${PS1-}" ]; then + if [ "`id -u`" -eq 0 ]; then + PS1='# ' + else + PS1='$ ' + fi + fi + fi + + if [ -d /etc/profile.d ]; then + for i in /etc/profile.d/*.sh; do + if [ -r $i ]; then + . $i + fi + done + unset i + fi + + $ bashdb /etc/profile + +For help on `bashdb` or options, use the ``--help`` option. + +.. code:: console + + $ bashdb --help + + Usage: + bashdb [OPTIONS] + + Runs bash under a debugger. + + options: + ... + + + +Calling the debugger from your program +=========================================== + +Sometimes it is not feasible to invoke the program from the debugger. +Although the debugger tries to set things up to make it look like your +program is called, sometimes the differences matter. Also the debugger +adds overhead and slows down your program. + +Another possibility then is to add statements into your program to call +the debugger at the spot in the program you want. To do this, you source +``bashdb/dbg-trace.sh`` from where wherever it appears on your filesystem. +This needs to be done only once. + +After that you call ``_Dbg_debugger``. + +Here is an Example: + +.. code:: console + + source path-to-bashdb/bashdb/dbg-trace.sh + # work, work, work. + # ... some bash code + + _Dbg_debugger + # start debugging here + + +Since `_Dbg_debugger`` a function call, it can be nested inside some sort of +conditional statement allowing one to be very precise about the +conditions you want to debug under. And until first call to ``_Dbg_debugger``, +there is no debugger overhead. + +Note that ``_Dbg_debugger`` causes the statement *after* the call to be stopped at. diff --git a/docs/features.rst b/docs/features.rst new file mode 100644 index 00000000..ec05f46a --- /dev/null +++ b/docs/features.rst @@ -0,0 +1,69 @@ +.. contents:: :local: + +Features +======== + +Since this debugger is similar to other_ trepanning_ debuggers_ and *gdb* +in general, knowledge gained by learning this is transferable to those +debuggers and vice versa. + +Source-code Syntax Colorization +------------------------------- + +Terminal source code is colorized via pygments_ . And with that you +can set the pygments color style, e.g. "colorful", "paraiso-dark". See +set_style_ . Furthermore, we make use of terminal bold and emphasized +text in debugger output and help text. Of course, you can also turn +this off. + + +Command Completion +------------------ + +Terminal command completion is available. Command completion is not +just a simple static list, but varies depending on the context. For +example, for frame-changing commands which take optional numbers, on +the list of *valid numbers* is considered. + +Terminal Handling +----------------- + +We can adjust debugger output depending on the line width of your +terminal. If it changes, or you want to adjust it, see set_width_ . + +Smart Eval +---------- + +If you want to evaluate the current source line before it is run in +the code, use ``eval``. To evaluate text of a common fragment of line, +such as the expression part of an *if* statement, you can do that with +``eval?``. See eval_ for more information. + +More Stepping Control +--------------------- + +Sometimes you want small steps, and sometimes large stepping. + +This fundamental issue is handled in a couple ways: + +Step Granularity +................ + +There are now ``step`` *event* and ``next`` *event* commands with +aliases to ``s+``, ``s>`` and so on. The plus-suffixed commands force +a different line on a subsequent stop, the dash-suffixed commands +don't. Without a suffix you get the default; this is set by the :ref:`set different ` command. + + +.. _pygments: http://pygments.org +.. _pygments_style: http://pygments.org/docs/styles/ +.. _other: https://www.npmjs.com/package/trepanjs +.. _trepanning: https://pypi.python.org/pypi/trepan2 +.. _debuggers: https://metacpan.org/pod/Devel::Trepan +.. _this: http://bashdb.sourceforge.net/pydb/features.html +.. _set_substitute: https://bashdb.readthedocs.org/en/latest/commands/set/substitute.html +.. _set_style: https://bashdb.readthedocs.org/en/latest/commands/set/style.html +.. _set_width: https://bashdb.readthedocs.org/en/latest/commands/set/width.html +.. _eval: https://bashdb.readthedocs.org/en/latest/commands/data/eval.html +.. _step: https://bashdb.readthedocs.org/en/latest/commands/running/step.html +.. _install: http://bashdb.readthedocs.org/en/latest/install.html diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..157cbf9d --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,38 @@ +.. bashdb documentation master file, created by + sphinx-quickstart on Fri Sep 29 07:09:20 2017. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +bashdb - a gdb-like debugger for bash +======================================== + +bashdb is a gdb-like debugger for bash. + +Since this debugger is similar to other_ trepanning_ debuggers_ and *gdb* +in general, knowledge gained by learning this is transferable to those +debuggers and vice versa. + +An Emacs interface is available via realgud_. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + features + install + entry-exit + syntax + commands + manpage + + +Indices and Tables +================== + + +* :ref:`genindex` +* :ref:`search` + +.. _trepanning: https://pypi.python.org/pypi/trepan3k +.. _debuggers: https://metacpan.org/pod/Devel::Trepan +.. _realgud: https://github.com/realgud/realgud diff --git a/docs/install.rst b/docs/install.rst new file mode 100644 index 00000000..916ef32a --- /dev/null +++ b/docs/install.rst @@ -0,0 +1,97 @@ +How to install +**************** + +.. toctree:: + + +From a Package +---------------- + +Repology_ maintains a list of various bundled ``bashdb`` packages. Below are some specific distributions that contain ``bashdb``. + +At the time this documentation was built, here is status that they provide: + +|packagestatus| + +Check the link above for more up-to-date information. + + +.. |packagestatus| image:: https://repology.org/badge/vertical-allrepos/bashdb.svg + :target: https://repology.org/project/bashdb/versions + + +MacOSX ++++++++ + +On OSX systems, you can install from Homebrew or MacPorts_. + +.. code:: console + + $ brew install bashdb + + +From Source +------------ + +Github +++++++ + + +Many package managers have back-level versions of this debugger. The most recent versions is from the github_. + +To install from git: + +.. code:: console + + $ git clone git://github.com/rocky/bashdb.git + $ cd bashdb + $ ./autogen.sh # Add configure options. See ./configure --help + + +If you've got a suitable ``bashhb`` installed, then + +.. code:: console + + $ make && make test + + +To try on a real program such as perhaps ``/etc/profile``: + +.. code:: console + + $ ./bashdb -L /etc/profile # substitute /etc/profile your favorite bash script + +To modify source code to call the debugger inside the program: + +.. code:: console + + source path-to-bashdb/bashdb/dbg-trace.sh + # work, work, work. + + _Dbg_debugger + # start debugging here + + +Above, the directory *path-to_bashdb* should be replaced with the +directory that `dbg-trace.sh` is located in. This can also be from the +source code directory *bashdb* or from the directory `dbg-trace.sh` gets +installed directory. The "source" command needs to be done only once +somewhere in the code prior to using `_Dbg_debugger`. + +If you are happy and `make test` above worked, install via: + +.. code:: console + + sudo make install + + +and uninstall with: + +.. code:: console + + $ sudo make uninstall # ;-) + + +.. _MacPorts: https://ports.macports.org/port/bashdb/summary +.. _Repology: https://repology.org/project/bashdb/versions +.. _github: https://github.com/rocky/bashdb diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 00000000..f6dd7848 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,36 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=python -msphinx +) +set SOURCEDIR=. +set BUILDDIR=_build +set SPHINXPROJ=bashdb + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The Sphinx module was not found. Make sure you have Sphinx installed, + echo.then set the SPHINXBUILD environment variable to point to the full + echo.path of the 'sphinx-build' executable. Alternatively you may add the + echo.Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/docs/manpage.rst b/docs/manpage.rst new file mode 100644 index 00000000..f351f40f --- /dev/null +++ b/docs/manpage.rst @@ -0,0 +1,173 @@ +.. _bashdb: + +.. toctree:: +.. contents:: + +bashdb command +############# + +Synopsis +-------- + + +**bashdb** [ *debugger-options* ] [ \-- ] [ *bash-script* [ *script-options* ...]] + +**bashdb** [ *options*] -c *execution-string* + +Description +----------- + +*bashdb* is a *bash* script to which arranges for another *bash* script +to be debugged. + +The debugger has a similar command interface as gdb_. + +If your zsh script needs to be passed options, add ``--`` before the +script name. That will tell *bashdb* not to try to process any further +options. + +Options +-------- + +:-h | --help: + +Print a usage message on standard error and exit with a return code +of 100. + +:-A | --annotation *level*: + +Sets to output additional stack and status information which allows +front-ends such as Emacs to track what's going on without polling. + +This is needed in for regression testing. Using this +option is equivalent to issuing: + +:: + + set annotate LEVEL + +inside the debugger. See :ref:`set annotate ` for more information on that command + +:-B | --basename: + +In places where a filename appears in debugger output give just the +basename only. This is needed in for regression testing. Using this +option is equivalent to issuing: + +:: + + set basename on + +inside the debugger. See :ref:`set basename ` for more information on that command + + +:-n | --nx | --no-init: + +Normally the debugger will read debugger commands in `~/.bashdbinit` if +that file exists before accepting user interaction. `.bashdbinit` is +analogous to GNU gdb's `.gdbinit`: a user might want to create such a +debugger profile to add various user-specific customizations. + +Using the `-n` option this initialization file will not be read. This +is useful in regression testing or in tracking down a problem with +one's `.bashdbinit` profile. + + +:-c | --command *command-string*: + +Instead of specifying the name of a script file, one can give an +execution string that is to be debugged. Use this option to do that. + + +:-q | --quiet: + +Do not print introductory version and copyright information. This is +again useful in regression testing where we don't want to include a +changeable copyright date in the regression-test matching. + + +:-x | --eval-command *debugger-cmdfile*: + +Run the debugger commands *debugger-cmdfile* before accepting user +input. These commands are read however after any `.bashdbinit` +commands. Again this is useful running regression-testing debug +scripts. + + +:-L | --library *debugger-library*: + +The debugger needs to source or include a number of functions and +these reside in a library. If this option is not given the default +location of library is relative to the installed bashdb script: +`../lib/bashdb`. + + + +:-T | --tempdir *temporary-file-directory*: + +The debugger needs to make use of some temporary filesystem storage to +save persistent information across a subshell return or in order to +evaluate an expression. The default directory is `/tmp` but you can +use this option to set the directory where debugger temporary files +will be created. + + +:-t | --tty *tty-name*: + +Debugger output usually goes to a terminal rather than stdout or stdin +which the debugged program may use. Determination of the tty or +pseudo-tty is normally done automatically. However if you want to +control where the debugger output goes, use this option. + + +:-V | --version: + +Show version number and no-warranty and exit with return code 1. + +Bugs +---- + +The way this script arranges debugging to occur is by including (or +actually "source"-ing) some debug-support code and then sourcing the +given script or command string. + +One problem with sourcing a debugged script is that the program name +stored in ``$0`` will not be the name of the script to be debugged. The +debugged script will appear in a call stack not as the top item but as +the item below `bashdb`. + +The `bashdb` script option assumes a version of bash with debugging +support. + +The debugger slows things down a little because the debugger has to +intercept every statement and check to see if some action is to be taken. + +See also +--------- + +* `bashdb github `_ - the github project page + +Author +------ + +The current version is maintained (or not) by Rocky Bernstein. + +Copyright +--------- + +Copyright (C) 2009, 2017, 2019, 2023, 2024 Rocky Bernstein +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +.. _gdb: http://sourceware.org/gdb/current/onlinedocs/gdb_toc.html diff --git a/docs/syntax.rst b/docs/syntax.rst new file mode 100644 index 00000000..6ab0f7db --- /dev/null +++ b/docs/syntax.rst @@ -0,0 +1,8 @@ +Command Syntax +************** + +.. toctree:: + :maxdepth: 1 + + syntax/command + syntax/suffixes diff --git a/docs/syntax/command.rst b/docs/syntax/command.rst new file mode 100644 index 00000000..b87df462 --- /dev/null +++ b/docs/syntax/command.rst @@ -0,0 +1,44 @@ +.. _syntax_command: + +Debugger Command Syntax +======================= + +Command names and arguments are separated with spaces like POSIX shell +syntax. Parenthesis around the arguments and commas between them are +not used. If the first non-blank character of a line starts with ``#``, +the command is ignored. + +Within a single command, tokens are then white-space split. Again, +this process disregards quotes or symbols that have meaning in ``bash``. +Some commands like :ref:`eval `, have access to the untokenized +string entered and make use of that rather than the tokenized list. + +Resolving a command name involves possibly 3 steps. Some steps may be +omitted depending on early success or some debugger settings: + +1. The leading token is next looked up in the debugger alias table and +the name may be substituted there. See "help alias" for how to define +aliases, and "show alias" for the current list of aliases. + +2. After the above, The leading token is looked up a table of debugger +commands. If an exact match is found, the command name and arguments +are dispatched to that command. + +3. If after all of the above, we still don't find a command, the line +may be evaluated as a bash statement in the current context of the +program at the point it is stopped. However this is done only if +"auto evaluation" is on. It is on by default. + +If :ref:`auto eval ` is not set on, or if running the +Python statement produces an error, we display an error message that +the entered string is "undefined". + +If you want bash shell command-processing, it's possible to go into an +python shell with the corresponding the command ``bash`` or ``shell``. It +is also possible to arrange going into an python shell every time you +enter the debugger. + +See also: +--------- + +:ref:`help syntax suffixes ` diff --git a/docs/syntax/suffixes.rst b/docs/syntax/suffixes.rst new file mode 100644 index 00000000..4f4885c0 --- /dev/null +++ b/docs/syntax/suffixes.rst @@ -0,0 +1,24 @@ +.. _syntax_suffixes: + +Command suffixes which have special meaning +=========================================== + +Some commands like `step`, or `list` do different things when an +alias to the command ends in a particular suffix like `>`. + +Here are a list of commands and the special suffixes: + +======= ====== +command suffix +======= ====== +list `>` +step `+`, `-`, `<`, `>` +next `+`, `-`, `<`, `>` +quit `!` +kill `!` +eval `?` +======= ====== + + +See the help on the specific commands listed above for the specific +meaning of the suffix. diff --git a/htdocs/remake/download.html b/htdocs/remake/download.html deleted file mode 100644 index cdd619ad..00000000 --- a/htdocs/remake/download.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - Remake - GNU Make with comprehensible tracing and a debugger - -Download Links - - - - - -

-


Remake - GNU Make with -comprehensible tracing and a debugger - Download Information -

-
- -

Although we don't provide pre-compiled binary packages (just source -code), others do; and we are most grateful for that. - -

- - - - - - - - - - - - - - - - - - -
source-codeSource code ready for uncompress, untar, and configure, and compile
- Packman links2linuxPackman Links2linux RPMs for GNU/Linux.
DebianDebian package. Or use: apt-get install remake
-
- -For the other operating systems supported, I know of no precompiled -binaries. You will have to get the source code and build it. - - diff --git a/htdocs/remake/features.html b/htdocs/remake/features.html deleted file mode 100644 index c49f8317..00000000 --- a/htdocs/remake/features.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - Pydb – Features - - - - - - - - - -

Remake – Features

- -

remake is a patched and modernized version of GNU make -utility that adds improved error reporting, the ability to trace -execution in a comprehensible way, and a debugger. Some of the -features of the debugger are: -

    -
  • see the target call stack. -
  • set breakpoints on targets, -
  • show and set variables, -
  • execute arbitrary "make" code -
  • issue shell commands while stopped in the middle of execution, -
  • inspect target descriptions -
  • write a file with the commands of the target expanded, -
- - - -

-$Id: features.html,v 1.1 2008/10/26 22:31:08 rockyb Exp $ - - diff --git a/htdocs/remake/index.html b/htdocs/remake/index.html deleted file mode 100644 index b313af1b..00000000 --- a/htdocs/remake/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - Remake - GNU Make with comprehensible tracing and a debugger - - - - - - - - - - - -

-

Remake – GNU Make with comprehensible tracing and a debugger

-

- -

remake is an enahanced version of GNU Make that adds -improved error reporting, better tracing, profiling and a debugger. - -

The latest version is based off of the GNU Make 4.2.1 source, although versions are available based on 4.1, and 3.82. - -We also have a some cool debuggers for: -Python 3, -Python 2, -GNU Bash, -Z-Shell, -Perl, and -NodeJS, - -

 
- - -

Source Code

- - -

Excerpts

- - -

- - Valid HTML 4.01 Transitional - - Valid CSS! - - - SourceForge Logo - -

-
- - diff --git a/htdocs/remake/links2linux.de.png b/htdocs/remake/links2linux.de.png deleted file mode 100644 index 0b9e0fade90674926f2f9a2f4d17b2c87d5b1ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2092 zcmV+{2-Ek8P)Fi00004XF*Lt006O% z3;baP0001EP)t-s|Ns9RW88LjchAt!c$Ua%YHXLKy-8-3V2RJ~@9?LpusUe9W{AP8 zv%Eid)^~%Kpw z(VLu~XnL0D*L*Di001a-MObuGZ)S9NVRB^vSXLlbWpZ4) zy*+-v?YAE{b4pC94?uR)^jo*^W%=;m?){I(y)q&6&3ugG0f%gLo#39N{sF5Aj<7N3 z*WV|gN;mxXh11UgXrbtR6RlExHtw}!eI2*Dt|G4KUp=7#S8D%>#*<{u^(s!U7f9AC zyYCNwzFSuSA6V$w7$4yvWGZlT9as~qy0Wy8V(h4@y?kFJD`y3EJ(<+ZnegffrxqvR zJC{zy{d-SNYf%oQyN8(&YgLTwM6FR70aFT1tZTbWyO(gv*7n>?#)U?Spep}v&-0E# zNe?g}EgCR%0d4A*bn!lxbSu-Ugsq!_8&X+1r!^WMF187$&DBtN2OFjO}T2q^{^-_^v z*&HpBD8!Mo2L~G7k(+DRh66juBJw_F6-G;jMI=BQu_i^zokWlRx?ZqYDVQVa7@MtqqAQNT z8cJlKlADZ-51~I4fg~m+mo!}IyhZwzbIlyDL|;L)smWr68`+tA)NL5G41KP3M@A^4 zUXeKkc{yve(j7F?^`Vbje4;DxY@|_?`qi1SQeJ?isA)K7k9*UHdq$ab<+wTH+g=OS z%U0lOFgAt3q&a%mXG*5YH3!*N(2O-(LFSYyjyju>FUUaK-$OG3?~mB5LiBNf1$H;d zL`B+#Icx7r(n)KT;0-V;)44nbH6Xf?aD z`!E8egW48i1X<*(kSntD4y6nul94wO@Z^xBo^+gA*)|#9!KJ=WZb;x+O2z;okX5V( z(g@U{^-uAgb}TL1>1dG=aE=))ks?-HLTJs#cE!H!?_`o8!4VYEpvKyDocJ z1JVekkZCsUAa!f*4ssP{t%94!Gpglur2O@E6fHuvjgsYT8^Y0wNG=R+HcnQ+*03Oi z$=fRc%gQ3!#FznPy^?NSeE$ffjWmreDS?&VLL3^%#dt2YB8L!}N>6aal@cg1ltxq% z1A?u=o`Hg}{VLj#Tk=ts->hLSL4r+z%@8*5q;C}6XN`u?Ls%SiPrY{1 zl6c5Xl@kkwxx+#b-*~bpv-T&8AQdb`pG;owxsJpa&X-&|?=qF4$Mx~l69ER9&>*c> z@%t3;vt|u=mJYdENUTy+svU~$&;%9YM)M|Kz%ejhBnC*^(oMTJY?46Az&V9h#~O_r z2j_&oh}12Zxu&wM(4crx=+ie%Z84$9glr-kPI<5IfD%2KVFrN=Nfyp(Fa0b4o=F>w zZ-Nc2fwmCEBcci-?Qi7wYq16;y(7VEV^^qqv6dfwyX(4>nIeS7ghFCWY}-~LRS3HU zHqahGAqVgy^ib0pom020RC`5JnNd)Ir5W}%V)6)RSim&``l#OhcxxK6AGKalIw)gU z8^^8sIDjEU_)xq+=PMN2tb)oxNipG*7*Ov4pGG^tf$Hot_R*Mt5^&o<=wsXHXwcR% zCUraK{HY6*fmW%~ZxUi^nt66#6cnNOzkhsR@wln?H$sP}(61g}UOcQJ8}W+in}un>KjWoKftC8G zqvoHUc^&`7)9~{`ft~PU*vQMT-i)6=OR%HV>90@z#=6P5F0df&f7{y4=Tgk@ - - - - -GNU Remake Debugger - - - - - - - - - - - - - - - - - - - - -
[Top][Contents][Index][ ? ]
-

Using the GNU Make debugger

- - - -

This file describes the GNU Make debugger -

-

This is the 3.81+dbg-0.2 Edition, January 2009 -

-

Copyright (C) 2004, 2005, 2006, 2007, 2009 Rocky Bernstein -

- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1. Summary of the GNU Make Debugger

- -

The purpose of a debugger such as the GNU Make debugger is to allow you to see what is -going on “inside” the GNU Make debugger when it processes a Makefile. -

-

The GNU Remake debugger can do four main kinds of things (plus other things in support of -these) to help you catch bugs in the act: -

-
    -
  • -Have GNU Remake stop at specified places such as targets. - -
  • -Examine what has happened, when GNU Remake has stopped or encounters -an error. - -
  • -Change the internal state of things inside GNU Remake, so you can -experiment with correcting the effects of one bug and go on to -discover another. -
- -

Although you can use the the GNU Make debugger to debug Makefiles, it can also -be used just as a front-end for learning more about Makefiles and -writing them with GNU Remake. -

-

A degenerate and less-interactive form of debugging is tracing -in which one passively watches some of the steps that go on in -processing a Makefile. -

- - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1 Sample GNU Remake Debugger Sessions

- -

You can use this manual at your leisure to read all about the GNU Make debugger. -However, a handful of commands are enough to get started using the -debugger. This chapter illustrates those commands. -

- - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1.1 How NOT to debug GNU Make

- -

Before we get into debugging proper, we'll discuss tracing and a -pitfall the author once made in his first attempt to debug a large and -mysterious Makefile. Chances you may have have happened to you too. -

-

A simplified form of debugging is tracing. Often this may be -good enough to understand what might have gone wrong. In fact, in the -Unix shell world (tcsh, csh, bash, sh) -prior to my debugger for bash (http://bashdb.sourceforge.net) -tracing along with print statements was about all that was available -to debug a program. -

-

GNU Make has had for a long time a “debug” flag (--debug -or -d) which prints “lots of debugging information.” For the -unwary one might think you just add this simple option and that's -going to do what you want. Wrong!(1) -

-

Alas, the --debug option gives way too much information to be -helpful. Furthermore, debug-flag information omits information -that would be helpful. -

-

To elaborate upon this, here is a simple small Makefile with an -invalid shell command in it: -

-
 
!: # Makefile to show off tracing
-2: .PHONY: all
-3: all: foo
-4: 
-5: foo:
-6: 	@case $(MAKE) in \
-7: 	*/remake|remake) echo "Enlightended!";; \
-8: 	*/make|make) echo "This is what most folks use.";; \
-9: 	esac
-10: 	@bogus-command
-
- - -

But now let's see what happens when we run “debug” from an unpatched -GNU Make: -

-
 
$ /usr/bin/make -d -f test1.mk
-Copyright (C) 2002  Free Software Foundation, Inc.
-This is free software; see the source for copying conditions.
-There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
-PARTICULAR PURPOSE.
-Reading makefiles...
-Reading makefile `test1.mk'...
-Updating makefiles....
- Considering target file `test1.mk'.
-  Looking for an implicit rule for `test1.mk'.
-  Trying pattern rule with stem `test1.mk'.
-  Trying implicit prerequisite `test1.mk.o'.
-  Trying pattern rule with stem `test1.mk'.
-  Trying implicit prerequisite `test1.mk.c'.
-
-... over 350 lines later ...
-
- No need to remake target `test1.mk'.
-Updating goal targets....
-Considering target file `all'.
- File `all' does not exist.
-  Considering target file `foo'.
-   File `foo' does not exist.
-   Finished prerequisites of target file `foo'.
-  Must remake target `foo'.
-This is what most folks use.
-Got a SIGCHLD; 1 unreaped children.
-Putting child 0x095b1310 (foo) PID 13440 on the chain.
-Live child 0x095b1310 (foo) PID 13440 
-Reaping winning child 0x095b1310 PID 13440 
-make: bogus-command: Command not found
-Got a SIGCHLD; 1 unreaped children.
-Live child 0x095b1310 (foo) PID 13441 
-Reaping losing child 0x095b1310 PID 13441 
-make: *** [foo] Error 127
-Removing child 0x095b1310 PID 13441 from chain.
-
- - -

The output would have been about twice as long were it not for the -fact that we declared all a “phony” target! -

-

Clearly this information referring to rule stems, implicit -prerequisites, SIGCHLD, pids, and unreaped children is intended -for someone who is well versed with the internals of GNU Make. -

-

But even for someone such as myself who has become more knowledgeable -(through writing this debugger), it still isn't all that -helpful. In the midst of the above jumble, the program reports: -

 
make: bogus-command: command not found
-
-

?? Okay. But where in the source Makefile did that come from? -Since we added the debug output we see “foo” listed -beforehand after skipping hundreds of lines, but in a normal make, -there would have been no mention of “foo.” In our simple example -tracking down the location is easy. But when you have a Makefile -which is hundreds of lines long as any Makefile is when it is -generated from automake, it would be nice to list the line in -the Makefile and full filename as well as the target name. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1.2 Sample GNU Remake Trace Sessions

- -

Okay so now that we know what not to do, lets delve into things -may be more helpful. -

-

There are variants of the --debug command option that provide -shorter and more-interesting information. One is called “basic” -tracing. Another is the --just-print option. -

-

Again here's the sample Makefile: -

-
 
!: # Makefile to show off tracing
-2: .PHONY: all
-3: all: foo
-4: 
-5: foo:
-6: 	@case $(MAKE) in \
-7: 	*/remake|remake) echo "Enlightended!";; \
-8: 	*/make|make) echo "This is what most folks use.";; \
-9: 	esac
-10: 	@bogus-command
-
- - -

In an unpatched GNU Make version 3.81 (and earlier) GNU Make, ---just-print gives this: -

-
 
$ make --just-print -f test1.mk
-case make in \
-*/remake|remake) echo "Enlightended!";; \
-*/make|make) echo "This is what most folks use.";; \
-esac
-This is what most folks use.
-bogus-command
-
- -

Well, not much different from the original Makefile, except that -information about where this gets run from is curiously missing. If -there had been several targets that had commands, from the output it -would not be possible to determine which command was associated with -which target. -

-

One of the goals of GNU Remake is to include reference -information. Here's what we give instead: -

-
 
$ make --just-print -f test.mk1
-##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-/tmp/test1.mk:6: foo
-case /tmp/remake/src/./make in \
-*/remake|remake) echo "Enlightended!";; \
-*/make|make) echo "This is what most folks use.";; \
-esac
-##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-This is what most folks use.
-##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-/tmp/test1.mk:10: foo
-bogus-command
-##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-
- -

What's different is that we make more clear where in the file this -command is getting run from and from what target. This may be a little -bit subtle, but from the above output it is more apparent that there -are two separate commands(2) that are getting run -from target foo: one at line 6 and another at line 10. -

-

One last and perhaps also subtle point is the format of the location -information. This format is similar to other debugger output. The -above command is run inside a GNU Emacs compilation buffer the format -of the message is such that compile-goto-error will possition -one at that point in the file in another Emacs window. -

-

Now let's try --debug=basic alluded to at the beginning of this -section. In an unpatched GNU Make version 3.81 (and earlier) -GNU Make --debug=basic gives this: -

-
 
$ make --debug=basic -f test1.mk
-GNU Make 3.80
-Copyright (C) 2002  Free Software Foundation, Inc.
-This is free software; see the source for copying conditions.
-There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
-PARTICULAR PURPOSE.
-Reading makefiles...
-Updating goal targets....
- File `all' does not exist.
-   File `foo' does not exist.
-  Must remake target `foo'.
-This is what most folks use.
-make: bogus-command: Command not found
-make: *** [foo] Error 127
-##########################################################
-
- -

The --debug=basic command-line switch also works in -GNU Remake as well if that's all you want.(3) -

-

Now let's try the new kind of trace we provide in this patched -GNU Remake. We use the new option --trace which has the -short-form option format -x. -

-

And here's the trace of it: -

 
$ remake --trace -f test1.mk
-Reading makefiles...
-Updating goal targets....
- /tmp/test1.mk:3	File `all' does not exist.
-   /tmp/test1.mk:5	File `foo' does not exist.
-  /tmp/test1.mk:5	Must remake target `foo'.
-##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-/tmp/test1.mk:6: foo
-case /tmp/remake/src/./make in \
-*/remake|remake) echo "Enlightended!";; \
-*/make|make) echo "This is what most folks use.";; \
-esac
-##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-+ case /tmp/remake/src/./make in
-+ echo 'This is what most folks use.'
-This is what most folks use.
-##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-/tmp/remake/src/test1.mk:10: foo
-bogus-command
-##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-+ bogus-command
-/bin/sh: bogus-command: command not found
-test1.mk:10: *** [foo] Error 127
-
-#0  foo at /tmp/test1.mk:10
-#1  all at /tmp/test1.mk:3
-Command-line arguments:
-	"--trace -f test1.mk"
-
- - -

So in some ways this is just a combination of the enhanced (with -location information) --just-print option combined with the -enhanced --debug=basic information. -

-

What is completely new and hasn't been seen above is the shell tracing -information and information given when we hit an error. After the -error and we report the return code (127), the stack of targets is -listed. We were working on target foo on line 10 of file -/tmp/test1.mk which was rebuilt because we were making target -all on line 3 of file /tmp/test1.mk. -

-

In other words, when we hit the error, the above trace gives some idea -of why we decided to to run line 10 and what got executed before that, -what targets were in the process of getting considered at the error, -and how the program was run. -

-

One last subtlety that you might not have noticed is that we echoed -the command bogus-command even though the original makefile had -this set to be silent (in particular by preceding that command with an -@). When tracing, we override any silent execution (making execution -more verbose); information is usually helpful in finding what's going -on and what got run. -

-

In sum, I hope I've conveyed the idea that the goal is simple trace -output for a simple Makefile. Although I think that the above may be -improved, it is far better than what has previously been available in -GNU make. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1.3 Tracing Makefile Reading

- -

GNU Make and GNU Remake work like many other -interpreters. First Makefiles are read in and parsed and then they are -“executed” which in GNU Make means that dependency checks are -done and actions are performed based on those checks. However there -is quite a bit work that may be done just in portion which reads in -the Makefiles and performs variable expansion. -

-

To see this, let's use a real example – the Makefile for the GNU Make -+ Debugger. For comparison, here is a simple trace: -

 
$ remake --trace
-Reading makefiles...
-Updating goal targets....
- /tmp/remake/src/Makefile:257	File `all' does not exist.
-   /tmp/remake/src/Makefile:470	File `all-am' does not exist.
-  /tmp/remake/src/Makefile:470	Must remake target `all-am'. Is a phony target.
-  /tmp/remake/src/Makefile:470	Successfully remade target file `all-am'.
-/tmp/remake/src/Makefile:257	Must remake target `all'. Is a phony target.
-/tmp/remake/src/Makefile:257	Successfully remade target file `all'.
-remake: Nothing to be done for `all'.
-
- - -

So far so good – still pretty simple output even though the Makefile -in this case is pretty complex, is hundreds of lines long and has -thousands of dependencies noted. Digging just a little into this -complexity, If we want to trace the files that were read in performing -the above, we can use the sub-option read on the --trace -option: -

 
$ remake --trace=read Makefile
-Reading makefiles...
-Reading makefile `Makefile'...
-/tmp/remake/src/Makefile:329
-	Reading makefile `.deps/alloca.Po' (search path) (no ~ expansion)...
-/tmp/remake/src/Makefile:330
-	Reading makefile `.deps/getloadavg.Po' (search path) (no ~ expansion)...
-... about 32 more lines like the above ...
-
-Updating goal targets....
-remake: `Makefile' is up to date.
-
-
- - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1.4 Simple GNU Remake Debug Sessions

- -

Now let's go into the debugger. To do this, use the --debugger -or -X option. Again we'll use the Makefile from the source code -of this distribution. -

-
 
$  remake --debugger
-Reading makefiles...
-
-(/tmp/src/remake/src/Makefile:263)
-Makefile.in: Makefile.am ../config/readline.m4 ../gettext.m4 ../iconv.m4 ../lib-ld.m4 ../lib-link.m4 ../lib-prefix.m4 ../progtest.m4 ../acinclude.m4 ../configure.ac ../aclocal.m4
-mdb<0> 
-
- - -

Before the prompt mdb<0>, we show the position in the file, -the target Makefile.in, and the dependencies of this target -Makefile.am, ..config/readline.m4 .... -

-

The “0” in the prompt mdb<0> is the command history number -it increments as we enter commands. -

-

Is this really the top-level target? The where command, -(see Backtraces (‘where’)), shows you the target call stack: -

-
 
mdb<0> where
-
-=>#0  Makefile.in at /tmp/src/remake/src/Makefile:263
-  #1  Makefile at /tmp/src/remake/src/Makefile:276
-mdb<1> 
-
- - -

No, we were triggered by checking dependencies from -Makefile.(4) -

- -

Notice that the prompt now lists “1” since we entered a command. -

-

We can use the step command, (Step (‘step’)), to progress a little -in the interpretation or execution of the makefile: -

 
mdb<1> step
-
-(/tmp/src/remake/src/Makefile:290)
-../aclocal.m4: ../config/readline.m4 ../gettext.m4 ../iconv.m4 ../lib-ld.m4 ../lib-link.m4 ../lib-prefix.m4 ../progtest.m4 ../acinclude.m4 ../configure.ac
-mdb<2> where
-
-=>#0  ../aclocal.m4 at /tmp/remake/src/Makefile:290
-  #1  Makefile.in at /tmp/remake/src/Makefile:263
-  #2  Makefile at /tmp/remake/src/Makefile:276
-
- - -

Before the prompt the debugger printed some information about the -target, namely its name and dependencies. However if you want the full -details about a target, one can use the target (Examining Targets (‘target’) -command: -

 
mdb<3> target
-
-../aclocal.m4: ../config/readline.m4 ../gettext.m4 ../iconv.m4 ../lib-ld.m4 ../lib-link.m4 ../lib-prefix.m4 ../progtest.m4 ../acinclude.m4 ../configure.ac
-#  Implicit rule search has not been done.
-#  Implicit/static pattern stem: `'
-#  Last modified 2005-12-10 21:41:10
-#  File has not been updated.
-# automatic
-#  := ../aclocal.m4
-# automatic
-# % := 
-# automatic
-# * := 
-# automatic
-# + := ../config/readline.m4 ../gettext.m4 ../iconv.m4 ../lib-ld.m4 ../lib-link.m4 ../lib-prefix.m4 ../progtest.m4 ../acinclude.m4 ../configure.ac
-# automatic
-# | := 
-# automatic
-# < := ../config/readline.m4
-# automatic
-# ^ := ../config/readline.m4 ../gettext.m4 ../iconv.m4 ../lib-ld.m4 ../lib-link.m4 ../lib-prefix.m4 ../progtest.m4 ../acinclude.m4 ../configure.ac
-# automatic
-# ? := 
-#  commands to execute (from `Makefile', line 291):
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
- - -

I could have gotten the same output explicitly giving a target name -such as target ../aclocal.m4, or used the GNU Make -automatic variable name @. -

-

What is going on here is we are checking to see if the Makefile needs -to be remade, and in doing this we need to see if Makefile.in needs -to be remade and that depends on target ../aclocal.m4. -

-

We don't have to be stopped on a target to get information about it: -

-
 
mdb<4> target all-am
-
-target all-am
-
-all-am: Makefile make loadavg ar_fns.h arscan.h commands.h dbg_break.h dbg_cmd.h dbg_fns.h dbg_stack.h debug.h default.h dep.h dir_fns.h expand.h file.h function.h gettext.h hash.h implicit.h job.h make.h misc.h print.h read.h remake.h remote-stub.h rule.h trace.h types.h variable.h vpath.h
-#  Phony target (prerequisite of .PHONY).
-#  Implicit rule search has not been done.
-#  Implicit/static pattern stem: `'
-#  File does not exist.
-#  File has not been updated.
-# automatic
-#  := all-am
-# automatic
-# % := 
-# automatic
-# * := 
-# automatic
-# + := Makefile make loadavg ar_fns.h arscan.h commands.h dbg_break.h dbg_cmd.h dbg_fns.h dbg_stack.h debug.h default.h dep.h dir_fns.h expand.h file.h function.h gettext.h hash.h implicit.h job.h make.h misc.h print.h read.h remake.h remote-stub.h rule.h trace.h types.h variable.h vpath.h
-# automatic
-# | := 
-# automatic
-# < := all-am
-# automatic
-# ^ := Makefile make loadavg ar_fns.h arscan.h commands.h dbg_break.h dbg_cmd.h dbg_fns.h dbg_stack.h debug.h default.h dep.h dir_fns.h expand.h file.h function.h gettext.h hash.h implicit.h job.h make.h misc.h print.h read.h remake.h remote-stub.h rule.h trace.h types.h variable.h vpath.h
-# automatic
-# ? := 
-mdb<5> 
-
- - -

However information may change depending on where Make is. In -particular note that “Implicit rule search has not been done.” -

-

If all of this is proceeding too slowly, could set a -breakpoint on a target of interest, perhaps all-am. Like -this: -

-
 
mdb<4> restart
-Changing directory to /tmp/remake/src and restarting...
-Reading makefiles...
-
-
-/tmp/remake/src/Makefile:255: Makefile.in
-mdb<0> break all-am
-Breakpoint on target all-am set.
-
- - -

The restart command was used to restart execution since we've -already passed considering the "all-am" target. So let's -continue, (Continue (‘continue’)), execution and see what happens: -

-
 
-mdb<1> continue
-Updating goal targets....
- /tmp/remake/src/Makefile:250	File `all' does not exist.
-
-/tmp/remake/src/Makefile:461: all-am
-mdb<2> where
-
-=>#0  all-am at /tmp/src/remake/src/Makefile:472
-  #1  all at /tmp/src/remake/src/Makefile:259
-
- - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1.5 Debugging Variables

- -

We've seen we can get information about GNU Remake's targets. We -can also get information about GNU Remake's variables. That is done -with the print command. (See Print variable info (‘print’).) -

-
 
  mdb<4> print MAKE
-  (origin default) MAKE = $(MAKE_COMMAND)
-
- - -

The (origin default) means this is a built-in -definition. There is another print which does full expansion -of the variables. So if I run x (examine) instead I get: -

-
 
  mdb<5> examine MAKE
- (origin default) MAKE := /tmp/remake/src/./make
-
- - -

Note that in printing expanded values we use “:=” while non-expanded -values we use “=”. This output matches the semantics of these -assignment operators. -

-

In fact, examine doesn't need a variable name, it will work -with a string. So I could type “x This is $(MAKE)” or -“x $(bin_PROGRAMS) $(noinst_PROGRAMS)”. For the latter, I -get: -

-
 
  mdb<6> x $(bin_PROGRAMS) $(noinst_PROGRAMS)
-  make loadavg
-
- - -

No location identification is given here since what I put in -isn't a variable. -

-

But I can also change values too using either set or -setq. (See Setting a variable to an expanded string (‘set variable’) and Setting a variable to an unexpanded string (‘setq’).) Let's see the difference -between the two. -

-
 
  mdb<7> set MAKE $(MAKE_COMMAND)
-  Variable MAKE now has value '/tmp/remake/src/./make'
-  mdb<8> setq MAKE $(MAKE_COMMAND)
-  Variable MAKE now has value '$(MAKE_COMMAND)'
-
- - -

So with set, the value in the expression $(MAKE_COMMAND) -is expanded before the variable definition is assigned. With -setq, See section Setting a variable to an unexpanded string (‘setq’), the internal variables are kept -unexpanded. Which you use or want is up to you. -

-

Note the irregular syntax of set and "setq. Don't put an -equal sign (=) between the variable and the expression. That -is, set MAKE = $(MAKE_COMMAND)" gives: -

-
 
  Variable MAKE now has value '= /tmp/remake/src/./make'
-
- - -

which is probably not what you want. One may optionally put in the -the word "variable" when using set, one must not supply -it with "setq." Down the line, someone (maybe you!) will -probably put in a command parser. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1.6 Debugging Commands

- -

Now consider the following sample Makefile: -

 
$ cat -n test2
-1 PACKAGE=make
-2 
-3 all: $(PACKAGE).txt
-4 
-5 $(PACKAGE).txt: ../doc/mdb.texi
-6 	makeinfo --no-headers $< > $ 
- -
 
$ remake -X -f test2
-Reading makefiles...
-Updating goal targets....
- /tmp/remake/src/test2:3	File `all' does not exist.
-
-(/tmp/remake/src/test2:3): all
-
- -

As before we'll use the target command to show information about -all: -

 
mdb<0> target
-
-all: make.txt
-#  Implicit rule search has not been done.
-#  Implicit/static pattern stem: `'
-#  File does not exist.
-#  File has not been updated.
-# automatic
-# @ := all
-# automatic
-# % := 
-# automatic
-# * := 
-# automatic
-# + := make.txt
-# automatic
-# | := 
-# automatic
-# < := all
-# automatic
-# ^ := make.txt
-# automatic
-# ? := 
-
- -

When asking about target information on line 3, we now see that a -number of automatic variables have been set. We can also get -information about just these variables using the command target -all variables or info locals: -

-
 
mdb<1> info locals
-@ := all
-% := 
-* := 
-+ := make.txt
-| := 
-< := all
-^ := make.txt
-? := 
-
- -

The target “all” doesn't have any commands associated with it. If we -next to a target that does, we can see a full expansion of the -command that is about to be run: -

-
 
mdb<2> next
-
-   /tmp/remake/src/test2:5	File `make.txt' does not exist.
-
-(/tmp/remake/src/test2:5): make.txt
-mdb<3> target make.txt commands
-
-make.txt:
-#  commands to execute (from `test2', line 6):
-	makeinfo --no-headers $< > $@
-
-mdb<4> examine makeinfo --no-headers $< > $@
-makeinfo --no-headers ../doc/mdb.texi > make.txt
-
-
- -

Another way to do the above target and examine commands -in one go is ito use the “expand” option on the target command -rather than the “commands” option: -

-
 
mdb<5> target @ expand
-
-make.txt:
-#  commands to execute (from `test2', line 6):
-	-makeinfo --no-headers $< > $ 	
-#  commands to execute (from `test2', line 6):
-	-makeinfo --no-headers ../doc/mdb.texi > make.txt
-	
-
- -

Notice instead of giving the target name make.txt, @ -works as well. -

-

Now if we want to write out those commands as a shell script which -we might want to execute, we can use the write (Write commands of a target (‘write’)) -command: -

 
(/tmp/remake/src/test2:6): make.txt
-mdb<6> write
-File "/tmp/make.txt.sh" written.
-mdb<7> shell cat -n /tmp/make.txt.sh
-     1	#!/bin/sh
-     2  # cd /tmp/remake/src/
-     3	#/tmp/remake/src/test2:5
-     4	makeinfo --no-headers ../doc/mdb.texi > make.txt
-     5	
-
- -

And last we see that we can even issue a shell command (cat -n -/tmp/make.txt.sh) via the debugger command shell. (See -Running Shell commands ( ‘shell’).) -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

Free software

- -

the GNU Make debugger is free software, protected by the GNU -General Public License -(GPL). The GPL gives you the freedom to copy or adapt a licensed -program—but every person getting a copy also gets with it the -freedom to modify that copy (which means that they must get access to -the source code), and the freedom to distribute further copies. -Typical software companies use copyrights to limit your freedoms; the -Free Software Foundation uses the GPL to preserve these freedoms. -

-

Fundamentally, the General Public License is a license which says that -you have these freedoms and that you cannot take these freedoms away -from anyone else. -

-
- - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

Free Software Needs Free Documentation

- -

The biggest deficiency in the free software community today is not in -the software—it is the lack of good free documentation that we can -include with the free software. Many of our most important -programs do not come with free reference manuals and free introductory -texts. Documentation is an essential part of any software package; -when an important free software package does not come with a free -manual and a free tutorial, that is a major gap. We have many such -gaps today. -

-

Consider Perl, for instance. The tutorial manuals that people -normally use are non-free. How did this come about? Because the -authors of those manuals published them with restrictive terms—no -copying, no modification, source files not available—which exclude -them from the free software world. -

-

That wasn't the first time this sort of thing happened, and it was far -from the last. Many times we have heard a GNU user eagerly describe a -manual that he is writing, his intended contribution to the community, -only to learn that he had ruined everything by signing a publication -contract to make it non-free. -

-

Free documentation, like free software, is a matter of freedom, not -price. The problem with the non-free manual is not that publishers -charge a price for printed copies—that in itself is fine. (The Free -Software Foundation sells printed copies of manuals, too.) The -problem is the restrictions on the use of the manual. Free manuals -are available in source code form, and give you permission to copy and -modify. Non-free manuals do not allow this. -

-

The criteria of freedom for a free manual are roughly the same as for -free software. Redistribution (including the normal kinds of -commercial redistribution) must be permitted, so that the manual can -accompany every copy of the program, both on-line and on paper. -

-

Permission for modification of the technical content is crucial too. -When people modify the software, adding or changing features, if they -are conscientious they will change the manual too—so they can -provide accurate and clear documentation for the modified program. A -manual that leaves you no choice but to write a new manual to document -a changed version of the program is not really available to our -community. -

-

Some kinds of limits on the way modification is handled are -acceptable. For example, requirements to preserve the original -author's copyright notice, the distribution terms, or the list of -authors, are ok. It is also no problem to require modified versions -to include notice that they were modified. Even entire sections that -may not be deleted or changed are acceptable, as long as they deal -with nontechnical topics (like this one). These kinds of restrictions -are acceptable because they don't obstruct the community's normal use -of the manual. -

-

However, it must be possible to modify all the technical -content of the manual, and then distribute the result in all the usual -media, through all the usual channels. Otherwise, the restrictions -obstruct the use of the manual, it is not free, and we need another -manual to replace it. -

-

Please spread the word about this issue. Our community continues to -lose manuals to proprietary publishing. If we spread the word that -free software needs free reference manuals and free tutorials, perhaps -the next person who wants to contribute by writing documentation will -realize, before it is too late, that only free manuals contribute to -the free software community. -

-

If you are writing documentation, please insist on publishing it under -the GNU Free Documentation License or another free documentation -license. Remember that this decision requires your approval—you -don't have to let the publisher decide. Some commercial publishers -will use a free license if you insist, but they will not propose the -option; it is up to you to raise the issue and say firmly that this is -what you want. If the publisher you are dealing with refuses, please -try other publishers. If you're not sure whether a proposed license -is free, write to licensing@gnu.org. -

-

You can encourage commercial publishers to sell more free, copylefted -manuals and tutorials by buying them, and particularly by buying -copies from the publishers that paid for their writing or for major -improvements. Meanwhile, try to avoid buying non-free documentation -at all. Check the distribution terms of a manual before you buy it, -and insist that whoever seeks your business must respect your freedom. -Check the history of the book, and try to reward the publishers that -have paid or pay the authors to work on it. -

-

The Free Software Foundation maintains a list of free documentation -published by other publishers, at -http://www.fsf.org/doc/other-free-books.html. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2. Getting in and out and new GNU Remake Command Options

- -

This chapter discusses how to start the GNU Make debugger, and how to get out of it. -The essentials are: -

    -
  • -type ‘make --debugger make options’ to start the GNU Make debugger. -
  • -and type quit, C-c, or C-d inside the debugger to exit. -
- -

You don't have to use the command-line interface. At present there is -a front-end available via GNU Emacs which can be entered -via the Emacs command M-x mdb after loading Emacs' Grand -Unified Debugger, gud. See Using the GNU Make debugger from GNU Emacs. In the future there may be support in a DDD -as well. -

- - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.1 Starting the GNU Make debugger

- -

Note: it is important to use a debugger-enabled GNU Make. You will -get usage help output if a patched GNU Make is not used. -

-

As mentioned above, one can enter the GNU Make debugger via Emacs (and perhaps -later DDD). However you don't have to use either of these. And these still -need a way on their own to get things started. -

-

The enter the GNU Make debugger from a command line, use the ‘--debugger’ -or it's short form ‘-X’ option: -

-
 
make --debugger other-make-arguments...
-make -X other-make-arguments...
-
- -

This runs GNU Remake as it would normally do; that is Makefiles are -read and dependencies are checked. However it is in a “stepping” -mode and will go into the debugger read loop when before encounter in -“interesting” target. An “interesting” target is one that has -commands associated with it to rebuild the target. -

-

A suboption to the --debugger (or -X) option specifies -under what conditions to enter the debugger; it is specified by -putting an equals sign (`=') and then the suboption; for example: -

-
 
make -X=preread other-make-arguments...
-
- -

Here is a full list of debugger options and suboptions... -

-
-
--debugger [preread | preaction | full | error | fatal]
-
-X [preread | preaction | full | error | fatal]
-
-

The “preread” suboption enters the debugger after command-line -options are parsed but before any Makefiles have been read. It also -puts GNU Remake in step-tracing mode and sets the debugger to enter -if it encounters an error. -

-

The “preaction” suboption enters the debugger after command-line -options are parsed and after Makefiles have been read, but before any -action is performed. It also puts GNU Remake in step-tracing mode -and sets the debugger to enter if it encounters an error. -

-

The “error” suboption enters the debugger when it encounters an -error. Depending on other conditions, GNU Remake can ignore errors -and continue processing. So the overall effect could be like the ---keep-going flag. -

-

The “fatal” suboption enters the debugger when it encounters a fatal -error. A fatal error generally cause GNU Remake to abort execution. -

-

The “full” suboption is just a convenience for giving the “enter,” -“error,” and “fatal” options described above. -execution. -

-

If no suboption is provided, “full” is assumed. -

-
-
--no-extended-errors
-

This option causes GNU Remake to not print a target stack -trace if it encounters an error. -

-
-
--trace [=suboption]
-
-x
-
-

Causes target names which have commands associated with them to get -printed before they are considered. If a target has multiple commands -each one is printed before they are run whether or not the command has -the GNU Remake @ specifier which would otherwise cause them not to -echo. -

-

This option also allows for suboptions, read, normal, -and full. The default is normal; read adds -tracing as Makefiles are read. -

-

tracing is independent of the --debugger option and can be used -in conjunction with it. Inside the debugger one can have the same -effect by issuing the debugger set trace on command. -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.2 Quitting the GNU Make debugger

- -

An interrupt (often C-c) does not exit from the GNU Make debugger, but -rather terminates the action of any the GNU Make debugger command that is in -progress and returns to the GNU Make debugger command level. Inside a debugger -command interpreter however C-c, C-d, and quit -will terminate the program. (See see section Quitting the Make debugger). -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3. GNU Remake Debugger Command Reference

- -

You can abbreviate the long name of the GNU Make debugger command to the first -few letters of the command name, if that abbreviation is unambiguous; -and you can repeat the next o rstep commands by typing -just <RET>. Some commands which require a parameter, such as -print remember the argument that was given to them. -

- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1 Command syntax

- -

A GNU Remake debugger command is a single line of input. There is -no limit on how long it can be. It starts with a command name, which -is followed by arguments whose meaning depends on the command name. -For example, the command step accepts an argument which is the -number of times to step, as in ‘step 5’. You can also use the -step command with no arguments. Some commands do not allow any -arguments. In commands that have attributes, the attribute can be -abbreviated to the minimum string that makes it unique. For example -“commands”in target all commands can be shortened to -“command” or “com” or just “c”. -

- - -

A blank line as input to the GNU Make debugger (typing just <RET>) means to -repeat the previous next or step command. -

- - -

Any text from a # to the end of the line is a comment; it does -nothing. This is useful mainly in command files -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.2 Getting help (‘help’)

- -

Once inside the debugger, you can always ask it for information on its -commands, using the command help. -

-
-
-
-
help
-
h
-

You can use help (abbreviated h) with no arguments to -display a short list of named classes of commands: -

-
- - -
 
mdb<0> help
-  Command                  Short Name  Aliases
-  ----------------------   ----------  ---------
-  break *target*                  (b)  L
-  comment *text*                  (#)
-  continue [target]               (c)
-  delete breakpoint numbers..     (d)
-  down [amount]                   (D)
-  eval *string*                   (e)
-  examine *string*                (x)
-  finish                          (F)
-  frame *n*                       (f)
-  help [command]                  (h)  ?, ??
-  info [thing]                    (i)
-  next [amount]                   (n)
-  print {*variable* [attrs...]}   (p)
-  quit [exit-status]              (q)  exit, return
-  run                             (R)  restart
-  set {*option*|variable} *value* (=)
-  setq *variable* *value*         (")
-  shell *string*                  (!)  !!
-  show [thing]                    (S)
-  skip                            (k)
-  step [amount]                   (s)
-  target                          (t)
-  up [amount]                     (u)
-  where                           (T)  backtrace, bt
-  write [*target* [*filename*]]   (w)
-
-Readline command line editing (emacs/vi mode) is available.
-For more detailed help, type h <cmd> or consult online-documentation.
-
- -
-
help command
-

With a command name as help argument, GNU Remake displays -short information on how to use that command. -

-
 
mdb<3> help where
-  where:
-	Show target stack.
-
- -

In addition to help, you can use the debugger command -info to inquire about the state of your script, or the state of -the GNU Make debugger itself. The listings under info in the Index -point to all the sub-commands. See section Command Index. -

-
- -
-
- -
-
info
-

This command (abbreviated i) is for describing the state of -your program. For example, you can list the arguments given to your -script with info args. You can get a complete list of the -info sub-commands with help info. -

-
 
mdb<0> help info
-  info [thing]:
-	Show the state of thing.
-	If no 'thing' is specified, show everything there is to show.
-
-	Available info subcommands are:
-	 line locals makefiles target variables warranty
-
-
-
- -

Subcommands can be abbreviated with the minimum number of letters to -make that subcommand distinct from another. For example info lo -is the same as info locals and info li is the same as -info line. -

-
-
-
-
info line
-

Shows the line number and file of for the place that you are currently -stopped. -

- -
-
info locals
-

Displays a the values of the automatic variables. -

- -
-
info makefiles
-

Displays the list of Makefiles read in the order that they were read -in. The last Makefile listed is the one you started with (e.g. Makefile). -

- -
-
info target
-

Displays target information. -

- -
-
info warranty
-

Displays GNU Warranty -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.3 Quitting the GNU Make debugger (‘quit’)

- -
-
- -
-
quit [return-code]
-
q [return-code]
-
-

To exit the GNU Make debugger, use the quit command (abbreviated -q), or type an end-of-file character (usually C-d). If -you do not supply return-code, the GNU Make debugger will terminate -normally or with exit code 0. Otherwise it use the value of the -return-code as the exit code. Usually a 0 exit is a normal exit. -

-

Often when running GNU Remake, a recursive call is made or made in -another directory. The quit only terminates only the last one: -the one that the debugger is in. The GNU Remake debugger arranges for the debug -flags to get passed down in recursive calls. Consequently when you -quit one of the inner make calls, you may find yourself still in the -debugger but up a call level. -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4 Stopping and Resuming Execution

- -

One important use of a debugger is to stop execution before it gets -into trouble, so you can investigate and find out what is going -on. However should GNU Remake accidentally continue to termination, -the GNU Make debugger has arranged for it not to leave the debugger without your -explicit instruction. That way, you can restart the program using the -same command arguments. -

-

Inside the GNU Make debugger, your script may stop for any of several reasons, -such as a signal, a breakpoint, or reaching a new line after a -debugger command such as step. You may then examine and -change variables, set new breakpoints or remove old ones, and then -continue execution. -

- - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.1 Breakpoints

- -

A breakpoint arranges for GNU Remake to stop whenever a -certain point in the Makefile is reached. -

-

You can set breakpoints with the break command and its variants -(see section Setting breakpoints), to specify the place where -your script should stop by target name. -

- - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.1.1 Setting breakpoints (‘break’)

- -

Breakpoints are set with the break command (abbreviated -b). -

-
-
break target
-

Set a breakpoint at target in the current Makefile. -

-
- -

Examples: -

 
mdb<0> break all
-
-Breakpoint on target all set.
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.1.2 Deleting breakpoints (‘delete’)

- -

It may be desirable to eliminate a breakpoint once it -has done its job and you no longer want stop there. -This is called deleting the breakpoint. A breakpoint that has -been deleted no longer exists; it is forgotten. -

-

It is not necessary to delete a breakpoint to proceed past it. the GNU Make debugger -automatically ignores breakpoints on the first instruction to be executed -when you continue execution. -

-
-
- - - -
-
delete breakpoint-number...
-

Delete the breakpoints by breakpoint-number specified as arguments. -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.2 Resuming Execution

- -

Continuing means resuming program execution until your script -completes normally. In contrast, stepping means executing just -one more “step” of your script, where “step” may mean either one -line of source code. Either when continuing or when stepping, -your script may stop even sooner, due to a breakpoint or a signal. -

- - - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.2.1 Next (‘next’)

-
-
- -
-
next
-

Continue processing your Makefile until control reaches a different -interesting source line, then stop it and return control to -the GNU Make debugger. This command is abbreviated n. -

-
-
next [count]
-

Continue running as in next, count times. If a -breakpoint is reached, or a signal not related to stepping occurs before -count steps, stepping stops right away. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.2.2 Step (‘step’)

-
-
- -
-
step
-

Stepping is like next but it is more fine-grained. It will stop -at every target that needs to be remade whether or not there are -commands associated with it. -

-

If there are multiple commands associated with a target step -will stop before each one. -

-
-
step [count]
-

Continue running as in step, so count times. If a -breakpoint is reached, or a signal not related to stepping occurs before -count steps, stepping stops right away. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.2.3 Skip (‘skip’)

-
-
-
-
skip [count]
-

Skip executing the remaining commands of the target you are stopped at. -This may be useful if you have an action that “fixes” existing code in -a Makefile. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.2.4 Continue (‘continue’)

-
-
- -
-
continue [target]
-

Resume program execution, at the address where your script last -stopped. If you specify a target name, a breakpoint is set at that -target before contining. If the target is invalid though, an error is -given and we don't continue. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.3 Signals

- -

A signal is an asynchronous event that can happen in a program. The -operating system defines the possible kinds of signals, and gives each -kind a name and a number. For example, in Unix SIGINT is the -signal a program gets when you type an interrupt character (often -C-c); SIGALRM occurs when the alarm clock timer goes off -(which happens only if your program has requested an alarm). -

-

GNU Remake sets up some signal handlers of children it spawns. When -we are running under the debugger when and we get a signal the -debugger read loop is entered. -

- -

Some signals, including SIGALRM, are a normal part of the -functioning of your program. Others, such as SIGSEGV, indicate -errors; these signals are fatal (they kill your program -immediately) if the program has not specified in advance some other -way to handle the signal. SIGINT does not indicate an error in -your program, but it is normally fatal so it can carry out the purpose -of the interrupt: to kill the program. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)

- -

In addition to help, you can use the GNU Make debugger commands -info and show to inquire about the state of your -program, or the state of GNU Remake itself. Each command supports -many topics of inquiry; here we introduce each of them in the -appropriate context. The listings under info in the Index -point to all the sub-commands. See section Command Index. -

-
-
- -
-
info
-

This command (abbreviated i) is for describing the state of -your debugger setting. For example, you can show whether GNU Remake -has set to ignore errors or not. -

- -
-
set
-

In addition to showing GNU Remake settings you can change them or -change GNU Remake variables with set. For example, you can -change setting GNU Remake has whether to ignore errors. -

- -
-
show
-

In contrast to info, show is for describing the state of -GNU Remake itself. -You can change most of the things you can show, by using the -related command set; -

-

The distinction between info and show however is a bit -fuzzy and is kept here to try to follow the GDB interface. -

- -

To display all the settable parameters and their current -values, you can use show with no arguments; you may also use -info set. Both commands produce the same display. -

-
- -

Here are force miscellaneous show subcommands, all of which are -exceptional in lacking corresponding set commands: -

-
-
- -
-
show command
-

Shows the list of commands previously entered -

- - -
-
show version
-

Show what version of GNU Remake is running. You should include this -information in the GNU Make debugger bug-reports. If multiple versions of -GNU Remake are in use at your site, you may need to determine which -version you are running; as the GNU Make debugger evolves, new commands are -introduced, and old ones may wither away. The version number is the -same as the one announced when you start GNU Remake. -

- -
-
show warranty
-

Display the GNU “NO WARRANTY” statement, or a warranty, -if your version of the GNU Make debugger comes with one. -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6 Examining the Stack (‘where’, ‘frame’, ‘up’, ‘down’)

- -

When you enter the debugger, one thing you'll probably want to know is -where it stopped and some idea of how it got there. -

- -

Each time your Makefile performs dependency checking (sometimes as -implicit rules or pattern-substitution rules), information about the -target that caused the new target to be considered action is saved on -a stack. This target call stack then is this a history of the -dependency checks that got you to the point that you are currently -stopped at. -

- -

One of the stack frames is selected by the GNU Make debugger and many -the GNU Make debugger commands refer implicitly to the selected frame. In -particular, whenever you ask the GNU Make debugger to list lines without giving -a line number or location the value is found in the selected frame. -There are special the GNU Make debugger commands to select whichever frame you -are interested in. See section Selecting a frame. -

-

When your program stops, the GNU Make debugger automatically selects the -currently executing frame and describes it briefly, similar to the -frame command. -

- - - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.1 Stack frames

- -

The target stack is divided up into contiguous pieces called -stack frames, or frames for short. The frame contains the -line number of the target which triggered the next one to be -considered, the Makefile file name that the line in that refers to a -target name. When some of this information is be missing you may see a -filename shown as “null” or have line number 0. -

- - - -

When your script is started, the stack has only one frame, that of the -function main. This is called the initial frame or the -outermost frame. Each time a function is called, a new frame is -made. Each time a function returns, the frame for that function invocation -is eliminated. If a function is recursive, there can be many frames for -the same function. The frame for the function in which execution is -actually occurring is called the innermost frame. This is the most -recently created of all the stack frames that still exist. -

- -

the GNU Make debugger assigns numbers to all existing stack frames, starting with -zero for the innermost frame, one for the frame that called it, -and so on upward. These numbers do not really exist in your script; -they are assigned by the GNU Make debugger to give you a way of designating stack -frames in the GNU Make debugger commands. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.2 Backtraces (‘where’)

- -

A backtrace is essentially the same as the call stack: a summary of -how your script got where it is. It shows one line per frame, for -many frames, starting with the place that you are stopped at (frame -zero), followed by its caller (frame one), and on up the stack. -

-

If GNU Remake is in the reading phase the backtrace shows the -nesting of include files. If GNU Remake is in the interpretation -phase the backtrace shows the nesting of targets. -

-
-
-
-
where
-
backtrace
-
bt
-
T
-

If we are reading Makefiles, print a backtrace of the included -Makefile stack. If we are evaluating the Makefile to bring targets up -to date, print a backtrace of the target stack. In either case, we print -line per frame. -

-
-
where n
-
backtrace n
-
bt n
-
T n
-

Similar, but print only the innermost n frames. A negative -number prints the outermost n frames. -

-
-
- - - -

Each line in the backtrace shows the frame number and the function -name, the source file name and line number, as well as the function name. -

-

Here is an example of a backtrace taken a program in the -regression-tests ‘parm.sh’. -

-
 
./make -X
-
-/tmp/remake/src/Makefile:228: Makefile.in
-mdb<0> step
-
-/tmp/remake/src/Makefile:263: make
-mdb<1> where
-
-=>#0  make at /tmp/remake/src/Makefile:263
-  #1  all-am at /tmp/remake/src/Makefile:386
-  #2  all at /tmp/remake/src/Makefile:224
-
-
- -

However if we have set debugging to stop before reading makefiles are -we are in the reading phase, we show included Makefiles: -

-
 
$ ./make --debugger=preread
-Reading makefiles...
-Reading makefile `Makefile'...
-
-(/tmp/remake/src/Makefile:1)
-mdb<0> step
-/tmp/remake/src/Makefile:324
-	Reading makefile `.deps/alloca.Po' (search path) (no ~ expansion)...
-
-(/tmp/remake/src/.deps/alloca.Po:1)
-mdb<1> where
-
-=>#0  /tmp/remake/src/.deps/alloca.Po:1
-  #1  /tmp/remake/src/Makefile:324
-
-mdb<2> next
-/tmp/remake/src/Makefile:327
-	Reading makefile `.deps/getloadavg.Po' (search path) (no ~ expansion)...
-/tmp/remake/src/Makefile:328
-	Reading makefile `.deps/ar_fns.Po' (search path) (no ~ expansion)...
-/tmp/remake/src/Makefile:329
-
-... lots of lines deleted ...
-
-	Reading makefile `.deps/version.Po' (search path) (no ~ expansion)...
-/tmp/remake/src/Makefile:360
-	Reading makefile `.deps/vpath.Po' (search path) (no ~ expansion)...
-Updating goal targets....
- /tmp/remake/src/Makefile:254	File `all' does not exist.
-
-(/tmp/remake/src/Makefile:254): all
-mdb<3> 
-
- - -

Note in the above ‘step’ goes on to the next read of a makefile -while the ‘next’ command can be used to skip over all of the -remaining reads. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.3 Selecting a frame (‘up’, ‘down’, ‘frame’)

- -

Commands for printing targets script work on whichever -stack frame is selected at the moment. Here are the commands for -selecting a stack frame; all of them finish by printing a brief -description of the stack frame just selected. -

-
-
-
-
up n
-

Move n frames up the stack. For positive numbers n, this -advances toward the outermost frame, to higher frame numbers, to frames -that have existed longer. n defaults to one. -

- - -
-
down n
-

Move n frames down the stack. For positive numbers n, this -advances toward the innermost frame, to lower frame numbers, to frames -that were created more recently. n defaults to one. You may -abbreviate down as do. -

-
- -

All of these commands end by printing two lines of output describing the -frame. The first line shows the frame number, the function name, the -arguments, and the source file and line number of execution in that -frame. The second line shows the text of that source line. -

-

For example: -

-
 
mdb<8> up
-/tmp/remake/src/Makefile:386: all-am
-mdb<8> T
-  #0  make at /tmp/remake/src/Makefile:263
-=>#1  all-am at /tmp/remake/src/Makefile:386
-  #2  all at /tmp/remake/src/Makefile:224
-
- -
-
- -
-
frame args
-

The frame command allows you to move from one stack frame to -another, and to print the stack frame you select. args is the -the stack frame number. Without an argument, frame prints the -current stack frame. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7 Examining Data

- - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.1 Print variable info (‘print’)

- - -

One way to examine variables the print -command (abbreviated p). However a more versatile print command -is x; it can print arbitrary string expands which of course -includes variable. -

-
-
- -
-
print variable-name
-
-

Use print to display GNU Remake's variables. As such, -variable names should not be preceded with a dollar sign. -

-
 
mdb<0> print SHELL
-Makefile:168 (origin: makefile) SHELL = /bin/sh
-
-/tmp/remake/Makefile:243: Makefile.in
-mdb<1> print $MAKE   # don't use $
-Can't find variable $MAKE
-
-/tmp/remake/Makefile:243: Makefile.in
-mdb<1> print shell   # note case is significant
-Can't find variable shell
-
- - -
-
print
-
p
-
-

If you omit variable, the GNU Make debugger displays the last expression again. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.2 Print a string expanded (‘examine’)

- -
-
x string
-
- - -

The x command expands the string given using GNU Remake's -internal variables. The expansion would be the same as if the string -were given as a command inside the target. -

-
 
mdb<0> examine MAKE
-(origin default) MAKE := /tmp/remake/src/./make
-
-
-/tmp/remake/src/Makefile:264: Makefile.in
-
-mdb<1> print MAKE  # note the difference with the ``print''
-(origin default) MAKE = $(MAKE_COMMAND)
-
-mdb<2> examine $(MAKE)   # Note using $( ) doesn't matter here...
-/tmp/remake/src/./make          # except in output format - no origin info
-
-/tmp/remake/src/Makefile:264: Makefile.in
-
-mdb<2> p COMPILE
-Makefile:104 (origin: makefile) COMPILE := $(CC) $(DEFS) $(DEFAULT_INCLUDES) 
-
-/tmp/remake/src/Makefile:264: Makefile.in
-mdb<10> x compile starts: $(CC) $(DEFS) $(DEFAULT_INCLUDES)
-compile starts: gcc -DLOCALEDIR=\"\" -DLIBDIR=\"/usr/local/lib\" -DINCLUDEDIR=\"/usr/local/include\" -DHAVE_CONFIG_H -I. -I..
-
-
-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.3 Examining Targets (‘target’)

- -

the GNU Make debugger can print information about targets. When your script -stops, the GNU Make debugger spontaneously prints the line and target name -where it stopped. Likewise, when you select a stack frame -(see section Selecting a frame), the GNU Make debugger the default -target name is changed. -

-
-
target
-
t
-

print information about the current target. -

- -
-
target target
-
t target
-

Print information about target. A list of attributes can be -specified after the target name. The list of attributes names are -

-
-
attributes
-

Show the list of “attributes” associated with the target. Attributes -can be: -

    -
  • implicit rule search has been done -
  • phony: has no file associated with it -
  • precious: -
  • a command-line target -
- -
-
commands
-

Show the list of commands that need to get run in order to bring the -target up to date. -

-
-
depends
-

Show the targets that this one depends on. -

-
-
expand
-

Show the list of commands that need to get run in order to bring the -target up to date with GNU Remake variables expanded. -

-
-
nonorder
-

Show the dependencies that are not ordered. -

-
-
previous
-
state
-

Show status of target: -

    -
  • Successfully updated -
  • Needs to be updated -
  • Failed to be updated -
  • Invalid - error of some sort -
- -
-
time
-

This shows the time that the file was last modified and if the file -has been brought up to date. If it is not up to date you will see the -message “File is very old.” If a target is “phony”, i.e. doesn't -have file associated with it, the message “File does not exist.” -will appear instead of the time. In some cases you may see -“Modification time never checked.” -

-
-
variables
-

Show single-character automatic state variables (if defined): -

    -
  • @ - the target name -
  • % - target member name, when target is an the archive member -
  • * - the stem with which an implicit rule matches -
  • + - like $^ but with the duplicate dependencies listed in order -
  • < - the name of the first prerequisite -
  • ^ - the names of all prerequisites (no duplicates) -
  • ? - the names of all prerequisites newer than the target (@) -
- -

Note that there are other automatic variables defined based on -these. In particular those that have a `D' or `F' suffix, e.g. $(@D), -or $(*F). These however are not listed here but can shown in a -print command or figured out from their corresponding -single-letter variable name. -

-
-
- -
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.4 “Listing” Targets (‘list’)

- -

This is really a short-hand for issing a target commmand with -parameters depends and comamnds. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.5 Write commands of a target (‘write’)

- -
-
-
-
write [target [filename|here]]
-
-

Use this to write the command portion of a target with GNU Remake's -internal variables expanded. If a filename is given that is the file -where the expanded commands are written. If the filename is “here” -then it is not written to a file but output inside the debugger as -other debugger command behaves. And if no file name is given a -filename based on the target name is created. -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.6 Print all variables (‘info variables’)

- -
-
info variables
-
- -

If you want to all list variables, use this command. -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.8 Evaluation and Execution

- - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.8.1 Subsection Evaluating GNU MAKE commands ( ‘eval’)

-
-
- - -
-
eval command string
-
e
-
-

A powerful command is the ability to enter MAKE fragments and have -them interpreted on the fly. This can be done using the eval -command. For example to “include” a makefile, you might enter -eval include .... Some of the other commands given -elsewhere can be performed by eval. In particular, instead of -using the “setq” debugger command, one could issue the command as -eval VAR=value. -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.8.2 Running Shell commands ( ‘shell’)

- -
-
- - -
-
shell command string
-
!
-
-

If you need to execute occasional shell commands during your -debugging session, there is no need to leave or suspend the GNU Make debugger; you can -just use the shell command or its alias !. -

-

Invoke a shell to execute command string. -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.9 Interfacing to the OS (‘cd’, ‘pwd’)

- -
-
- -
-
cd
-
-

Set working directory to directory for debugger and program -being debugged. The change does not take effect for the program being -debugged until the next time it is started. -

- - -
-
pwd
-
!
-
-

Prints the working directory as the program sees things. -

-
-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.10 Controlling the GNU Make debugger (‘set’)

- -

You can alter the way GNU Remake -interacts with you in various ways given below. -

- - - - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.10.1 Basename (‘set basename’)

- -
-
-
-
set basename on/off/toggle
-

The basename level controls how much information the GNU Make debugger prints -when it has to show a file name. When this is on we just show the base -filename part an not the path info. When the GNU Make debugger is run as a -subprocess of GNU Emacs of DDD, it is important -to show full pathnames. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.10.2 Ignoring errors (‘set ignore-errors’)

- -
-
-
-
set ignore-errors on/off/toggle
-
-

Use this to change whether you ignore errors. Turning it on is -as though you started GNU Remake with the --ignore-errors option. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.10.3 Tracing (‘set basename’)

- -
-
-
-
set trace on/off/toggle
-
-

Use this to change whether you want tracing or not. Turning it on is -as though you started GNU Remake with the --trace option. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.10.4 Setting a variable to an expanded string (‘set variable’)

- -
-
- -

Sets variable to the value string, but string is -expanded first as it would be when you use examine. -

-
- -

One nice use of set variable in debugging is to set the value of -SHELL to include tracing in that. Here's an example: -

-
 
mdb<0> set variable SHELL $(SHELL) -x
-Variable SHELL now has value '/bin/sh -x'
-mdb<1> 
-
- - -

Now we'll show this in a real example - stepping (or actually -“next”ing though the top-level makefile in the source distribution -for GNU Remake: -

-
 
$ remake -X
-Reading makefiles...
-
-(/tmp/remake/Makefile:256)
-Makefile.in: Makefile.am config/readline.m4 gettext.m4 iconv.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4 acinclude.m4 configure.ac aclocal.m4
-mdb<0> set variable SHELL $(SHELL) -x
-Variable SHELL now has value '/bin/sh -x'
-mdb<1> n
-Updating goal targets....
- /tmp/remake/Makefile:250	File `all' does not exist.
-
-(/tmp/remake/Makefile:250)
-all: config.h
-mdb<2> p SHELL
-Makefile:156 (origin: debugger) SHELL = /bin/bash -x
-mdb<3> n
-   Prerequisite `stamp-h1' is newer than target `config.h'.
-  /tmp/remake/Makefile:288	Must remake target `config.h'.
-
-(/tmp/remake/Makefile:288)
-config.h: stamp-h1
-mdb<4> n
-if test ! -f config.h; then \
-  rm -f stamp-h1; \
-  remake stamp-h1; \
-else :; fi
-+ test '!' -f config.h
-+ :
-  /tmp/remake/Makefile:288	Successfully remade target file `config.h'.
-
- - -

Above we see the script source code followed by the trace information -– we took the “else” branch which has the null statement “:”. -

-

Probably in the future, we'll arrange some stepping or tracing -mode perform this SHELL reassignment trick of adding -x. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.10.5 Setting a variable to an unexpanded string (‘setq’)

-
- - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.10.6 Basename (‘setq’)

- -
-
-
-
setq variable string
-
-

Sets variable to the value string, but string is -not expanded first as it is not you use print. -

-
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4. Using the GNU Make debugger from a front-end user interface

- -

The only front-ends that can use the GNU Make debugger as a back-end debugger is -GNU Emacs. In the future an interface via DDDmay be -available. -

- - - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4.1 Using the GNU Make debugger from GNU Emacs

- -

A special interface allows you to use GNU Emacs to view (and -edit) the source files for the program you are debugging with -the GNU Make debugger. -

-

To use this interface, use the command M-x mdb in GNU Emacs. -Give the executable file you want to debug as an argument. This -command starts the GNU Make debugger as a subprocess of GNU Emacs, with input and -output through a newly created GNU Emacs buffer. -

-

Using the GNU Make debugger under GNU Emacs is just like using the GNU Make debugger -normally except for two things: -

-
    -
  • -All “terminal” input and output goes through the GNU Emacs buffer. -
- -

This applies both to the GNU Make debugger commands and their output, and to the input -and output done by the program you are debugging. -

-

This is useful because it means that you can copy the text of previous -commands and input them again; you can even use parts of the output -in this way. -

-

All the facilities of Emacs' Shell mode are available for interacting -with your script. In particular, you can send signals the usual -way—for example, C-c C-c for an interrupt, C-c C-z for a -stop. -

-
    -
  • -the GNU Make debugger displays source code through GNU Emacs. -
- -

Each time the GNU Make debugger displays a stack frame, Emacs automatically finds the -source file for that frame and puts an arrow (‘=>’) at the -left margin of the current line. Emacs uses a separate buffer for -source display, and splits the screen to show both your the GNU Make debugger session -and the source. -

-

Explicit the GNU Make debugger list or search commands still produce output as -usual, but you probably have no reason to use them from Emacs. -

-

Warning: If the directory where your script resides is not your -current directory, it can be easy to confuse Emacs about the location of -the source files, in which case the auxiliary display buffer does not -appear to show your source. the GNU Make debugger can find programs by searching your -environment's PATH variable, so the the GNU Make debugger input and output -session proceeds normally; but Emacs does not get enough information -back from the GNU Make debugger to locate the source files in this situation. To -avoid this problem, either start the GNU Make debugger mode from the directory where -your script resides, or specify an absolute file name when prompted for the -M-x gdb argument. -

-

A similar confusion can result if you use the the GNU Make debugger file command to -switch to debugging a program in some other location, from an existing -the GNU Make debugger buffer in Emacs. -

- -

By default, M-x mdb calls the make --debugger. If you -need to call the GNU Make debugger by a different name (for example, if you -keep several configurations around, with different names) you can set -the Emacs variable gud-mdb-command-name; for example, -

-
 
(setq gud-mdb-command-name "make")
-
- -

(preceded by M-: or ESC :, or typed in the *scratch* buffer, or -in your ‘.emacs’ file) makes Emacs call the program named -“mdb” instead. -

-

In the the GNU Make debugger I/O buffer, you can use these special Emacs commands in -addition to the standard Shell mode commands: -

-
-
C-h m
-

Describe the features of Emacs' the GNU Make debugger Mode. -

-
-
M-s
-

Execute to another source line, like the the GNU Make debugger step command; also -update the display window to show the current file and location. -

-
-
M-n
-

Execute to next source line in this function, skipping all function -calls, like the the GNU Make debugger next command. Then update the display window -to show the current file and location. -

-
-
C-c C-f
-

Execute until exit from the selected stack frame, like the the GNU Make debugger -finish command. -

-
-
M-c
-

Continue execution of your script, like the the GNU Make debugger continue -command. -

-

Warning: In Emacs v19, this command is C-c C-p. -

-
-
M-u
-

Go up the number of frames indicated by the numeric argument -(see (Emacs)Arguments section `Numeric Arguments' in The GNU Emacs Manual), -like the the GNU Make debugger up command. -

-

Warning: In Emacs v19, this command is C-c C-u. -

-
-
M-d
-

Go down the number of frames indicated by the numeric argument, like the -the GNU Make debugger down command. -

-

Warning: In Emacs v19, this command is C-c C-d. -

-
-
- -

In any source file, the Emacs command C-x SPC (gud-break) -tells the GNU Make debugger to set a breakpoint on the source line point is on. -

-

If you accidentally delete the source-display buffer, an easy way to get -it back is to type the command frame in the the GNU Make debugger buffer, to -request a frame display; when you run under Emacs, this recreates -the source buffer if necessary to show you the context of the current -frame. -

-

The source files displayed in Emacs are in ordinary Emacs buffers -which are visiting the source files in the usual way. You can edit -the files with these buffers if you wish; but keep in mind that the GNU Make debugger -communicates with Emacs in terms of line numbers. If you add or -delete lines from the text, the line numbers that the GNU Make debugger knows cease -to correspond properly with the code. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4.2 Using GNU Remake from DDD

- -

GNU Remake support is rather new in DDD. As a programming -language, GNU Remake is not feature rich: there are no record -structures or hash tables (yet), no pointers, package variable scoping -or methods. So much of the data display and visualization features of -DDD are disabled. -

-

As with any scripting or interpreted language (e.g. Perl), one can't -step by a single machine-language instruction. So the ddd Stepi/Nexti -commands are disabled. -

-
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

5. Reporting Bugs

- -

Your bug reports play an essential role in making the GNU Remake reliable. -

-

Reporting a bug may help you by bringing a solution to your problem, or it -may not. But in any case the principal function of a bug report is to help -the entire community by making the next version of GNU Remake work better. Bug -reports are your contribution to the maintenance of GNU Remake. -

-

In order for a bug report to serve its purpose, you must include the -information that enables us to fix the bug. -

- - - - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

5.1 Have you found a bug?

- -

If you are not sure whether you have found a bug, here are some guidelines: -

-
    -
  • - - -
  • -If the debugger gets a fatal signal, for any input whatever, that is a -GNU Remake bug. Reliable debuggers never crash. - - -
  • -If GNU Remake produces an error message for valid input, that is a -bug. (Note that if you're cross debugging, the problem may also be -somewhere in the connection to the target.) - - -
  • -If GNU Remake does not produce an error message for invalid input, -that is a bug. However, you should note that your idea of -“invalid input” might be our idea of “an extension” or “support -for traditional practice”. - -
  • -If you are an experienced user of debugging tools, your suggestions -for improvement of GNU Remake are welcome in any case. -
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

5.2 How to report bugs

- -

Submit bug reports for GNU Remake. Until better mechanism is set up -the preferred method is to submit them directly using -rocky@panix.com. There are also a bug tracking system -and, help, developer and open discussion forums which can be found via -http://http://sourceforge.net/forum/?group_id=37260. -

-

Although this code shares a lot with BASH, the debugger is of course -not yet supported by the BASH team, so if there is a debugger problem -reporting it via bashbug or to bug-bash@gnu.org or posted to -the newsgroup gnu.bash.bug probably won't help, unless you are -sure the bug resides in the vanilla bash code and and show that. -

-

The fundamental principle of reporting bugs usefully is this: -report all the facts. If you are not sure whether to state a -fact or leave it out, state it! -

-

Often people omit facts because they think they know what causes the -problem and assume that some details do not matter. Thus, you might -assume that the name of the variable you use in an example does not matter. -Well, probably it does not, but one cannot be sure. Perhaps the bug is a -stray memory reference which happens to fetch from the location where that -name is stored in memory; perhaps, if the name were different, the contents -of that location would fool the debugger into doing the right thing despite -the bug. Play it safe and give a specific, complete example. That is the -easiest thing for you to do, and the most helpful. -

-

Keep in mind that the purpose of a bug report is to enable us to fix the -bug. It may be that the bug has been reported previously, but neither -you nor we can know that unless your bug report is complete and -self-contained. -

-

Sometimes people give a few sketchy facts and ask, “Does this ring a -bell?” Those bug reports are useless, and we urge everyone to -refuse to respond to them except to chide the sender to report -bugs properly. -

-

To enable us to fix the bug, you should include all these things: -

-
    -
  • -The version of GNU Remake. GNU Remake announces it if you start -with no arguments; you can also print it at any time using version -command. - -

    Without this, we will not know whether there is any point in looking for -the bug in the current version of GNU Remake. -

    -
  • -The type of machine you are using, and the operating system name and -version number. - -
  • -What compiler (and its version) was used to compile BASH—e.g. -“gcc–3.1”. - -
  • -The command arguments you gave the compiler to compile your example and -observe the bug. For example, did you use ‘-O’? To guarantee -you will not omit something important, list them all. A copy of the -Makefile (or the output from make) is sufficient. - -

    If we were to try to guess the arguments, we would probably guess wrong -and then we might not encounter the bug. -

    -
  • -A complete input script, and all necessary source files, that will -reproduce the bug. - -
  • -A description of what behavior you observe that you believe is -incorrect. For example, “It gets a fatal signal.” - -

    Of course, if the bug is that GNU Remake gets a fatal signal, then we -will certainly notice it. But if the bug is incorrect output, we might -not notice unless it is glaringly wrong. You might as well not give us -a chance to make a mistake. -

    -

    Even if the problem you experience is a fatal signal, you should still -say so explicitly. Suppose something strange is going on, such as, your -copy of GNU Remake is out of synch, or you have encountered a bug in -the C library on your system. (This has happened!) Your copy might -crash and ours would not. If you told us to expect a crash, then when -ours fails to crash, we would know that the bug was not happening for -us. If you had not told us to expect a crash, then we would not be able -to draw any conclusion from our observations. -

    -
  • -If you wish to suggest changes to the GNU Remake source, send us context -diffs. If you even discuss something in the GNU Remake source, refer to -it by context, not by line number. - -

    The line numbers in our development sources will not match those in your -sources. Your line numbers would convey no useful information to us. -

    -
- -

Here are some things that are not necessary: -

-
    -
  • -A description of the envelope of the bug. - -

    Often people who encounter a bug spend a lot of time investigating -which changes to the input file will make the bug go away and which -changes will not affect it. -

    -

    This is often time consuming and not very useful, because the way we -will find the bug is by running a single example under the debugger -with breakpoints, not by pure deduction from a series of examples. -We recommend that you save your time for something else. -

    -

    Of course, if you can find a simpler example to report instead -of the original one, that is a convenience for us. Errors in the -output will be easier to spot, running under the debugger will take -less time, and so on. -

    -

    However, simplification is not vital; if you do not want to do this, -report the bug anyway and send us the entire test case you used. -

    -
  • -A patch for the bug. - -

    A patch for the bug does help us if it is a good one. But do not omit -the necessary information, such as the test case, on the assumption that -a patch is all we need. We might see problems with your patch and decide -to fix the problem another way, or we might not understand it at all. -

    -

    Sometimes with a program as complicated as GNU Remake it is very hard to -construct an example that will make the program follow a certain path -through the code. If you do not send us the example, we will not be able -to construct one, so we will not be able to verify that the bug is fixed. -

    -

    And if we cannot understand what bug you are trying to fix, or why your -patch should be an improvement, we will not install it. A test case will -help us to understand. -

    -
  • -A guess about what the bug is or what it depends on. - -

    Such guesses are usually wrong. Even we cannot guess right about such -things without first using the debugger to find the facts. -

- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6. History and Acknowledgments

- -

My idea for a debugger for GNU Remake came about on working on a -debugger for bash (http://bashdb.sourceforge.net). I knew the -bash debugger was good enough when it was able to debug -autoconf-generated script which are tens of thousands of lines long. -

-

But almost immediately after scaling this new height, I became sunk -deep in depression when I realized that to debug the configuration -mess I also needed to deal with Makefiles, if not also autoconf, and -automake as well. -

-

After seeing an article on the auto-configuration mess -http://freshmeat.net/articles/view/889 I posted a query to ask -if anyone was interested in writing a debugger for GNU Remake. -

-

Almost year later and no takers, I was reminded of my query by -accident when I got a query from one of the GNU mailing lists that I -am on about slow e-mail posting to the GNU Make mailing list. -

-

I again suggested the idea of a debugger and was told how incredibly -difficult it would be to write a debugger and how incredibly unique -GNU Make is. At that point I looked into the code and to my -surprise and delight I found that in contrast to BASH the code, -GNU Make is much smaller and written in a more modern coding style -(although certainly it could use much improvement). In fact, it had -most of the information stored that would be helpful in a -debugger. All I would need to do is add a GNU readline for the debug -loop, extend to save a target stack and track line numbers and report -line numbers better. But this last part I'd been through with the bash -debugger. -

-

All in all, I've been very pleased at how far I've been able to get -with much less effort than needed for the bash debugger. That's not to -say that much work isn't still needed or that the overall design -couldn't be improved. -

-

This documentation was modified from the GNU Bash Debugger (bashdb) Reference -manual (which in turn was modified from GNU Bash debugger (gdb). -

-

Additions to this section are particularly welcome. If you or your -friends (or enemies, to be evenhanded) have been unfairly omitted from -this list, we would like to add your names! -

- - - -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

Command Index

-
Jump to:   ! -   -# -   -
-B -   -C -   -D -   -E -   -F -   -H -   -I -   -N -   -P -   -Q -   -R -   -S -   -U -   -W -   -X -   -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

!
! (shell)3.8.2 Running Shell commands ( ‘shell’)

#
# (a comment)3.1 Command syntax

B
b (break)3.4.1.1 Setting breakpoints (‘break’)
backtrace3.6.2 Backtraces (‘where’)
break3.4.1.1 Setting breakpoints (‘break’)

C
c (continue)3.4.2.4 Continue (‘continue’)
cd directory3.9 Interfacing to the OS (‘cd’, ‘pwd’)
continue3.4.2.4 Continue (‘continue’)

D
d (delete)3.4.1.2 Deleting breakpoints (‘delete’)
delete3.4.1.2 Deleting breakpoints (‘delete’)
do (down)3.6.3 Selecting a frame (‘up’, ‘down’, ‘frame’)
down3.6.3 Selecting a frame (‘up’, ‘down’, ‘frame’)

E
e (eval)3.8.1 Subsection Evaluating GNU MAKE commands ( ‘eval’)
eval3.8.1 Subsection Evaluating GNU MAKE commands ( ‘eval’)
examine3.7.2 Print a string expanded (‘examine’)

F
frame3.6.3 Selecting a frame (‘up’, ‘down’, ‘frame’)

H
h (help)3.2 Getting help (‘help’)

I
i (info)3.2 Getting help (‘help’)
i (info)3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)
info3.2 Getting help (‘help’)
info3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)
info line3.2 Getting help (‘help’)
info locals3.2 Getting help (‘help’)
info makefiles3.2 Getting help (‘help’)
info set3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)
info target3.2 Getting help (‘help’)
info variables3.7.6 Print all variables (‘info variables’)
info warranty3.2 Getting help (‘help’)

N
n (next)3.4.2.1 Next (‘next’)
next3.4.2.1 Next (‘next’)

P
p (print)3.7.1 Print variable info (‘print’)
print3.7.1 Print variable info (‘print’)
print3.7.1 Print variable info (‘print’)
pwd3.9 Interfacing to the OS (‘cd’, ‘pwd’)

Q
q (quit)3.3 Quitting the GNU Make debugger (‘quit’)
quit [return-code]3.3 Quitting the GNU Make debugger (‘quit’)

R
RET (repeat last command)3.1 Command syntax

S
s (step)3.4.2.2 Step (‘step’)
set3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)
set basename3.10.1 Basename (‘set basename’)
set ignore-errors3.10.2 Ignoring errors (‘set ignore-errors’)
set trace3.10.3 Tracing (‘set basename’)
set variable variable string3.10.4 Setting a variable to an expanded string (‘set variable’)
setq variable string3.10.6 Basename (‘setq’)
shell3.8.2 Running Shell commands ( ‘shell’)
show3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)
show command3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)
show version3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)
show warranty3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)
skip3.4.2.3 Skip (‘skip’)
step3.4.2.2 Step (‘step’)

U
up3.6.3 Selecting a frame (‘up’, ‘down’, ‘frame’)

W
where3.6.2 Backtraces (‘where’)
write [target filename|here]3.7.5 Write commands of a target (‘write’)

X
x (examine)3.7.2 Print a string expanded (‘examine’)

-
Jump to:   ! -   -# -   -
-B -   -C -   -D -   -E -   -F -   -H -   -I -   -N -   -P -   -Q -   -R -   -S -   -U -   -W -   -X -   -
- -
- - - - - - - - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

General Index

-
Jump to:   - -   -
-B -   -C -   -D -   -E -   -F -   -G -   -H -   -I -   -L -   -O -   -P -   -R -   -S -   -T -   -V -   -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

-
-X2.1 Starting the GNU Make debugger
-x2.1 Starting the GNU Make debugger

B
backtraces3.6.2 Backtraces (‘where’)
breakpoints3.4.1 Breakpoints
bug criteria5.1 Have you found a bug?
bug reports5.2 How to report bugs
bugs5. Reporting Bugs

C
change working directory3.9 Interfacing to the OS (‘cd’, ‘pwd’)
comment3.1 Command syntax
continuing3.4.2 Resuming Execution
crash of debugger5.1 Have you found a bug?
current stack frame3.6.3 Selecting a frame (‘up’, ‘down’, ‘frame’)

D
DDD4.2 Using GNU Remake from DDD
debugger bugs, reporting5.2 How to report bugs
debugger crash5.1 Have you found a bug?
delete breakpoints3.4.1.2 Deleting breakpoints (‘delete’)

E
Emacs4.1 Using the GNU Make debugger from GNU Emacs
error on valid input5.1 Have you found a bug?
examining data3.7.1 Print variable info (‘print’)

F
fatal signal5.1 Have you found a bug?
fatal signals3.4.3 Signals
frame number3.6.1 Stack frames
frame, definition3.6.1 Stack frames

G
GNU Emacs4.1 Using the GNU Make debugger from GNU Emacs

H
history3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)

I
initial frame3.6.1 Stack frames
innermost frame3.6.1 Stack frames
interrupt2.2 Quitting the GNU Make debugger
invalid input5.1 Have you found a bug?

L
latest breakpoint3.4.1.1 Setting breakpoints (‘break’)

O
on-line documentation3.2 Getting help (‘help’)
outermost frame3.6.1 Stack frames

P
print working directory3.9 Interfacing to the OS (‘cd’, ‘pwd’)
printing data3.7.1 Print variable info (‘print’)

R
repeating next/step commands3.1 Command syntax
reporting bugs5. Reporting Bugs
resuming execution3.4.2 Resuming Execution

S
selected frame3.6 Examining the Stack (‘where’, ‘frame’, ‘up’, ‘down’)
shell escape3.8.1 Subsection Evaluating GNU MAKE commands ( ‘eval’)
shell escape3.8.2 Running Shell commands ( ‘shell’)
signals3.4.3 Signals
stack traces3.6.2 Backtraces (‘where’)
stepping3.4.2 Resuming Execution

T
target stack3.6 Examining the Stack (‘where’, ‘frame’, ‘up’, ‘down’)
target stack frame3.6.1 Stack frames
tracebacks3.6.2 Backtraces (‘where’)

V
version number3.5 Status and Debugger Settings (‘info’, ‘show’, ‘set’)

-
Jump to:   - -   -
-B -   -C -   -D -   -E -   -F -   -G -   -H -   -I -   -L -   -O -   -P -   -R -   -S -   -T -   -V -   -
- - -
- - - - - - -
[Top][Contents][Index][ ? ]
-

Footnotes

-

(1)

-

From the standpoint of a -nice user interface, this options should get replaced with ---trace. At present, this change is probably a little to young to -to make such a bold change, tempting as it is to do. -

(2)

-

or “jobs” in the -terminology used when we used --debug -

(3)

-

Actually the -output is a little bit different here since we give a more context -about the position when a fatal error is encountered. -

(4)

-

for a while I thought there was a bug in -remake since I the default goal target all is not -listed. But the above is correct. In fact, GNU Make first tries -to remake the Makefile it has read in. See “How Makefiles are -Remade” in the GNU Make manual for details. -


- - - - - - -
[Top][Contents][Index][ ? ]
-

Table of Contents

-
- - -
-
- - - - - - -
[Top][Contents][Index][ ? ]
-

About This Document

-

- This document was generated on March, 11 2010 using texi2html 1.78. -

-

- The buttons in the navigation panels have the following meaning: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Button Name Go to From 1.2.3 go to
[ < ] BackPrevious section in reading order1.2.2
[ > ] ForwardNext section in reading order1.2.4
[ << ] FastBackBeginning of this chapter or previous chapter1
[ Up ] UpUp section1.2
[ >> ] FastForwardNext chapter2
[Top] TopCover (top) of document  
[Contents] ContentsTable of contents  
[Index] IndexIndex  
[ ? ] AboutAbout (help)  
- -

- where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure: -

- -
    -
  • 1. Section One -
      -
    • 1.1 Subsection One-One -
        -
      • ...
      • -
      -
    • -
    • 1.2 Subsection One-Two -
        -
      • 1.2.1 Subsubsection One-Two-One
      • -
      • 1.2.2 Subsubsection One-Two-Two
      • -
      • 1.2.3 Subsubsection One-Two-Three     - <== Current Position
      • -
      • 1.2.4 Subsubsection One-Two-Four
      • -
      -
    • -
    • 1.3 Subsection One-Three -
        -
      • ...
      • -
      -
    • -
    • 1.4 Subsection One-Four
    • -
    -
  • -
- -
-

- - This document was generated on March, 11 2010 using texi2html 1.78. - -
- -

- - diff --git a/htdocs/remake/mdb.html b/htdocs/remake/mdb.html deleted file mode 100644 index d5df2b5f..00000000 --- a/htdocs/remake/mdb.html +++ /dev/null @@ -1,8 +0,0 @@ - - - -Your Page Title - - - - diff --git a/htdocs/remake/openlogo-nd-25.png b/htdocs/remake/openlogo-nd-25.png deleted file mode 100644 index 5ad44879c5adb47e1f07175a0c74fcec6c69d098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmV;X0a^ZuP)P0015c0{{R3?lMK`0000pP)t-s|NsBT z05<#Y^3_0S%Me5ApR@GO+3~;4*-&*$U%$ct z0004EOGiWihy@);00009a7bBm000XT000XT0n*)m`~Uy|2XskIMF-LW0u~1jv>B4U z0002_Nkl2o&*+8u!22f?{iPZ#o}2(E(-vjZu^f8(|9OhLS-+sh&h~ zaKOcVZ)XDeUQF~T|6ZBF|1DWPdC6Z{U5N529i$+~#X#Wtmz~N~6}JF)s|_&ET3auU zhEvYZJN9L_w6`V*RRAu@Oxi4cicWJ5)K*UBVAuhIo}5O+$prcAI4#CH792YO+{|jK zU*avtgTW!Cg5{ipz1`|hOT!%+&Se;fNG^f+lvZ=@Z7hX zBUi`qy-r5@JL?_iWPJak9_4O8$PbKdP#-9M3O};OlNP^H|3KN=ay|Qe0WBN_-J~i- QPyhe`07*qoM6N<$f^Yh@AOHXW diff --git a/htdocs/remake/remake-ddd.png b/htdocs/remake/remake-ddd.png deleted file mode 100644 index 5dd5c9f6afc5cd6276ef362920eedf87335a05ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45687 zcma%iXH-*5_ctP5KvbHb(u;^vMWjg=1*8hn44o)FR0$;%5s(fl(whnqBm@YM(2GDo zdWVouRGO5~2_=*_+`HA`?eKIm~ z6dBq1YgB)cp7h>lW+eUnWuvL~i0t^}_o*%~f%JshP5rqi85s@fEe+#2vb2orq=%HR zo@hU&9HwEtCc$r2N0ClO#zpqzk+Ol0#d4i|G5^^6JZ~8jmD$KCB_}Y%tT2YV{4M6w zAO-va1r-g|^**-380FxexRH02PWK({sW7^CO%~77IotKg$0(BEIJOMhM7p%D(!D05;37Lmr9?&^baQR5STSe^*RW@K)D3yCXdFZoye`bOW=At; zb@61x>0mAX*Cm;8Db)W?Jb7$Hr-Ui`)Wvo>gfx1Pn#(zl*OvUhnZZmHbSS~w;*_VK zq2r7Jzq!o z+FJc4zAgE>N@Pyn@dBvuIB#F!Ubv@N_xc9*CrC=XVufMndd_5kU-)iUj65(~tnf z@XB^+ciJbBLu9Ocapz%ypTO{ViTtQ7^T<%GP4r>IXq?+aL?D*Y!MO%0KB9_4MZJuP z$FP(s6F*ms#w0l6SXnzo!NK&56bQBr%pZpYoZ_ovh9%5IB$LdS)qx068%-fy4WhZ@ z)b$&XRkXRt3RaC+(@h)~vmbUB^D@(5_pVjwildoU`Sez4W&A2m*O-mhX*my+)>s|| zqS;ExH#I~IdFC;gT-k*=M^V$sSIiDK`M=`q6np6!S>eq_ufG4n|8a&!l^~9oeb{Wz&%Ni1@?5biL0LF!d~OxJ4{kR9+@)v$-_(Ff$#OJ`Jth*_~flitQZ+`}u#q zOyRhLd)~&(BNpFy-`WZN%h0ATt3|lOfNv!iR+d3_{f^PhYpcf^E3UeWtpbl8h(O1` zIV>UUR9WL=p^_48`U)*3nz(^oq?vP=q{LC7uM@soY_LkPV{%+NXYTs!4g?a2$d03+m zx$(-gGJl(KS8B73wUlc|hQ{pJ2r27D4D_x622Mg9 z-P1UcRUe!zWsN}fqh=q6;z^vK1Ceq#f~Orp#(yi5N}JgPfE zy=>3NIo~0ntm3V=bH*_LR7&NrObL%9oXw-qZlXza{R2%|U(rl*i=UdJ?Of%uQ<-Nc z$I>za&ZqF5kRVdz6z5bfpRLrbFbs(~QTh4vvRxsocOb`~K*xv14M9736tk`h#B}eV zpu_Ib@T!O^emWCj16`{(v43l?8+-7`=D>Wz(LrYa@%Hgy@#>9ZSi|A4SC5?i99#fJ z`}@ep*p&8qJS8RB-?}aRrg5pkFSewPOP>ly^GSTxyW&n5nn_bO;`~2~Zgt^Y(#^t8 z2Y9yTFwnyHw}KR1k&Yk9EAA42Iqp=nn z@#96)PnMRbV|o_!=5Ig3W5=(HIIHnBsb9hj>3XWYJ+w$v^C_5mc@HnFW9=7}34dQ% z69hN=<1KQ|V}BeITkgL!8W8*HBjSH-)rvNmHDq=7H~X0x^0{;_6c2nDn{#Hqeoj&p zjAA;7V=J*2R{v+N4)0S#M8M{asZZ{J*NAIpCQ&Zzb&U;cz5DWDcHsV1kzMM)P3k}V zydGQ-g}1J^7CHOg>&6f&E@#fG&Sqg}=GXhy>ykRpSL>JmTQh>JiJ<(w)$q)My4jJh zgtx6+Iyc2d7Mz@nfgKbDT3t=|Po?IU-lN(D;8S!JI!94&1_6_kWA%9~N6Oy&e;@gL zx@90SsyO=)-CGM}#;uEt^YE|;-E>3xu;Lekb`_7BJClQsXQK}%w}$5Z0_$8?nl7aK z-zfbs7=P5pdDx!+&S}GY_t0VQMF8`$M2aw>-ob7u{WV_q4d>9JJ0Ev@VU2mdkE*CHa_wCkjV@rjyqMYHAKb z6C9+KBQU$($G8S!f)kH(vt3n!i}cfYW~BAXP&`U(*!HbOm^#*$-CX z7r;v|YpCii(ly@X^TpLkhRGm59ioqqj`o&|j}I-6+l7i7*{z?^M4M&nNj~o{0J7k~ zX^q55)>Qg>KkJsG4Fj2&DaeWzK5&SYT-J+q#x=f8q48_@}%du&IY{#zFP_5m) zNa!iO6JyTnC{bgP{%YIh;}1OY$s;&(IpEJ{?wyi*;E;!rQW#-4EDRxxlZlWJ6nKOCrV3 zhb26ejy(898|35thKiq3=6PuEZ0`H&fCpIB)%JE=(P;h8ile-?PS8^3C{EE$ed4V- z`u0nh+9znzO`pSfx^0FD|nMUqnjRau_3sk?%=>UsAhYAvyr>_*w9o<&O6al-nq}q5#LHI43>9 zb?293jw%J&Glt7EuIQB?jK@&{`H6`Znl)*fJ+^|5!1Z^t47|X^vOC`VJXCrud{5Icl%~DsZwQr|UsAsU^=X~^5LGIFq>f{{24bM}J>uG> zhj86>z7|}wVZuebM{QYG?4$sTI|r36tJC^qidhV4`*FVA8DXF*UX0ERNLSVtaTcl= zx}fV5mOP)gBVkGSDada{Uru0B;z$SJet>KOJZQjwdS9AKD~jpq=RI!C7gLML zd5&54z^QiO*;Pc9D<2LyDu06=d=Kot?UfGsn2*B;i>+3V=^a5f`S@yQq;t`Q9G=6j$KLdb#b~i9#=>qtz^)z`=BHW?5T%>+C*YIgwraniqcDj~ zZ?9`Y1hqM?4F0}(P_I8UGTvSlWx2EwdSkD!?W&%j%?pWax*9j@n}+vmz;g4)_Md0W zvuqyg6_v^g1m3Yk=3j2QSHbN4QP`R-y_Zi<&@(>nc@Mw&_e7q?#e)$-`@Qou%Sy-c z_f%sfvXzocgxS>r#q}O<_`o!ZsL4{pt(JFrNtb67l1*o=<%A8Ox*fEsinm<6IOU7B zCAPhnlLB3yJQ6u96s`u*B=;%KX4`%V&@?9t)hILofeel6`M#n)fru#l#r`y4o@dK6th-^P(q})i68Xg_w770N%kNsTU6Fn|1`CMHWD`YJ z4kIkM!C{H=w%A_d$pAsImypyG@-8br5c4G0i8iGV;B5gpUMfzx`u!GFDfsC~r3Ify^Y{JU z<8Z~}goP|dH^F!lMN@}_hG*IF8M1sM_e0DKyIs;j>FkOvc<*@e3spJ^>XsjZ%l1z8fa$A?|pI@wi7uPSK0WI>eatv=WYo z+jwypT}~ZdjdG42mp~QJ1&(?s`(hkxtp+S zuS3WjDHYx(vv5)vbX5q>2?aI2ueqSWIeKWD^1bY(R^2P!rv$2>Sv2wV?}zxihFGao zr;zGnAkM2xAgMRH@XAbKM>Ky`Y+=CAmu?HXLT2RmqPuo<9QsIh`uOqd1UMz(JF-uz zLP56t8Upq_t^~&m&?G*0AX3Q!ZJtCQCH|HKzyBIw#_jk_3-9jv()q^2SK<)knVp1tT=_P<0mNogs+EcWjs6;Xu$Z>M~7sR-iKD!kKpoZ;VCf)wjQ8 zrW2f~w3twEryQ`4nnPnlG&`1=Sfic5(T~$VC)_=H&sJbtbIE&j`5tEv1B|Sw{Bety zgN|#>fHV@P`5TPPha-=p2x-shQuarVFG04N@A-9q&XmG@f&C~A2z`ePe7?>bv~#2w zV(FkIqxz@7>QCA4H)xLRqDr^uy0M3%inrHU>n1Fmf9$4d#|$PWuJm78k(;cTBJSaP zE2b{&w`ETSZ4h@+UidFZ=EDwY_l%tJ{-(7ZMKM9xK&!$1_H6OH2%JmVI^t2UNY?p8!tzsP^95JuB6ANo%Fi5k z5RAt#vfA|vhCY1wR8l1gT8w3E-yGj3485-2v59homI z9A=LgB|hB6VB`bpP;X_n8v1%=iz_lmnH}u#-|()u9jt?{5|mMYl>i8muhqDuf%B9^ z&lR&5qXL9^C+g9YsRZbTV3OLm-WTScG}jhPJ8*Xi`I5rmBpYesbpQZBmu|W5Q@MTb z^D!IwM3ZC+Qwv_i*vj)RUaWvQ17c!ehgKKkfU%7}e>MfsDMEyJt&qWWOEzlMFf&3Q z1A2<2hNdC-LVo&HZpr7Yg~x~nPo7-EPZ-lVKX!-ZP&>u4rW}Igi%6%)Wb=@ej+_Cx zZ+LKEz@>O|Y4nC-44ys{E;fWRg?R2|Vrc=-(fjBPO=F$Xv{e3m=&6#l#F5gm^{Mn%g@rlFO`z z^=^ke8_+@Z`l!KX;hVRvJ%cC@GFGJIM?}6e$asZIGFw5)qg;D_0`VUyzw2Ln^uY=6 zqQfqy1s((3Gz#LFOCB%kKGp*-%GNxX(!XZRyR&B!c%h;2M=V;i1vd9J{u-g_i&XN0 z;@d`)lXF{T+if}%-9}zV2)u)Rw~qgU%-ElV=nB`aKtU@NR@p2j1*irnUS2<}pDA6R zY2@Msd|rUW)72-I{-X+C5Ad^36I}Pd{1A5)di$V46;CT>ArTns0&95pIA}VBIaN~4 z*|3B^+{Tja6FRM~nGQD6iv1CofV&1TX^o>bHlvE{8*QT$e1#@?n+n7I{un^zz`P1M zm1!wCc?k8Ng#DkN!>`!ELOAFLos^uf1T+m!$N#q1o#ausu?zxi6stvG5XNgFdkI($ zM(!$vjTjq~Vyd^A1#<5b+Re#1*V2gtvL9PMm>^Xr1lS*K(MjU_VV<6}_opn5tO?BS zWcwiEbIsEE6DJIhVjorH?})08b>CwHfA8NVnent#`hVaTkYx!w1G>K zzg!*iaOyQ7`lBF60Sn2UmyP;G;b3tABwx4()12P$?+=&3HQn5qt^*@R$By$ITu zq0xp`56H`-HV*-?Twj&s?}x1`t9M!vK2J>Rii{{+c4LaMpmvNzK=l+5XJhLVk6+4e za9Pmcq`JgUSO3|0yVsC^d^pfT-f|IDQjgBZwY0qPPpavLAhXNni@Qg$gfe`#SbZHM zU8h9NB~^+dCT(Go&gspgnEH*VmQ2@BmR$s9S?@oLo5HA=#(n4b%N{~h0bYi(hKIBA zsL@Bq4AziXSl7j~BzoioUi{^3_X|!n>SkwjmJpK#e!(%Nw`$5h*yR^(*sGa(q-g2HUiO^az`33J zZ2HfebdNy0dvh??40(Ih2a;g%f#%+v;S6*ss$|x(mxa%({ENA|@ssPr6GyZ4krSfT zRJcQ%H;?~^ipwNsUheyIy8p&9DvTq%b|AU{Z{hp8WI~X`z_&YRbLGDIkWu9}b=GLbU2Dar04 z?})rrw%y)#s005#kbfimfIA3FU2{B`)E!yBy{CszD95cG;*ZQT~kKC{c)mE!W z%Dd$!7HH1s_{zAuvD%QKK*`v}`xJTAI_pNvrL&hLDH#0^ z$UYv{n50SXp-Bm-m?dY1u|4}$rx`VU2A%72mzblC9(}b?;L1k2Y(@Z5<6qL~J_$Go z{dZSCT_{k67(ec%0!P;{iHNyLv0Cupm9s4=S;++poyVmooOneYp7{0yPIcvRPwfQ zbjm+7v54YQxeki8K9>V5;XI(B?3It{&<2aW_@6}@>sMv2%x1MU~PaO)8Zvj^W#1%)9Ui~wz(V4t63@$w+=q8bpp+ty~JKV0>-$^lvjWu@6tLWUV za#e;g9YFVzoMEdlqVItvh;dW- zw0si`3Il<>?#-#Yq9v0#st~3X-Rf=hY<3uQ${E+Jn1VY6P=q9Z-C55^FZ*j+lqglF zIw}s;Fa`+}uz46F7WLoQ3&FFlk4u)Gqn{Mtr6KpJSj;7SLw%9s{gKog*JZogeYUJz zdLti`sUSt&7qC~p4fv}-XEk{pwqbY^9(Vq~{hgx?)(i#REi~*x5j4NwmXApS*gVDQ z_F8UmSI8sbP~9Rx;P${p-Hn02&gi!PR}3%6pK||1*qony(!kUQ5W$-KcQ2leC5eP# z6SLXb{z-hnBsTIjCFN~-Yf~TH5tK^>mG4TO$^7faF^VJ_(`Xp@hBAm) z)*Q0^KYXzu?@Z?Lxt#MK2v1URM-nRTWZ%zx#tJ1XQ1onxY)5( z1l3&^gu11Z;?GP6 z$+wwpRErY3fxPwQ+)R=dw1mRY)-x7lY5rs&)xKf;GeNxBVkV^={svJfkf`^XG@~Hb1xZH4|F-{fB2NL}ZZG z!AweBJ=0r~(d|?DSqY^QlKn$16~O&Zxt3Hr4WNFCsB?8*zjU^yTokEfp!ciw`F|g` zBr&iRLkPTFB1dtJm4ACIfg@vScImPch^=<|Eg0rcm%imM(_n*lI;ehz8y2f(ta)GW z6Cc7mU%P3-8+QRtd^?Y67W>mP=3VC+e+^~K_H;IVq{+{EHSJd#YBX>726K7KuS>la zle39Z72x%6+mEV44rOq5yAnXHmevfdv>Sr)XjuFO*!Ce!dHh0(3L0jh?2)S#5rXuI> zw7p3%slaM9R8ho11mCdTHe%n}3ce$iCoi41-#(APPgdF7>BmaFR9iD7mWNQ?7Q1Zr zDyC)5q-U$;dsbm>)gMILKHX6d8a3PUoJH5h(n(W5RI}Pt{i@HwLPsBZTQCp9=0^u3uztVfIH>!Soita(=yVG6(!ps+IEMxMuR}M!5 z?IKoF`F~*A zJAlM|NrZm~8fBO5(mnC9xN3YmN{oI$w)OKZMPvi?Kx@{^Nyh;!yVCV9=3o#f$EJ#T#-J+f zX$Go6R*hs~3BoacAffKm4rszo=7-)o9MXp!y>P|-kF}VeW%c=9{jAoMZRQUeo~o{RmVc#Sh`!>gy#;m%%a$?_Q2D}k6 zQeW$b<$)_7FLNj$yMTD(Zt3%r-Fav$|_Wdg=zyA3gCE8yDSR@aV(nfIn$(fEmdrkuCm-lw(O!9dA5AS+?7B-)50k#h)1Gm zz`HdM?LDc%ks%D9*n6AmG_R5=Q}b<)uDy4i%5|U-YD=Qq1t(DzS6SUGbgRIg1*=MX zPSPQ&qBwcD3k;PWiZC7H)D%lw=p6>`taXh|re$Y&4o3k;hTW}?oT$tMoK4LLQIe|| z#QK&UxJDrYE8}rksC1jX(v$M-P-F#4S1T8K&`n*<7M=!zra*0059Q`fg$F;tk<+sq zSk?r65r~bRjR7#PJ9Xeluf}y0JHSu|BjEJeJcz(Mv^tS0n*OHo7uF7%DQnd5M}K7M zXX2>8UC-S>ew@!btQ%G9Wh;NK`%~JwhJ#+bh|6u@+$}@2bbC0H*o1qWevGPdKKMmR zh&EJu*=qWUWaDP8z4eka$&ihO-Z%zRNJox~}kgO!?#7fGAG(u_PyM4%}3rZ&1 zlVR6;vb?)8ro3!@64aW) z5St3jW?p~FCkNN}8QpDHk>+omDX(p_I5DK+B)3HQG;{mWBH18{?e|5!`wvv}sQceX zx`po|H+($CO;h`6NjA7qgS-unNK9Dl;lEC=cgNHd=Sf>^qRf41X47Em2C(&m0TBus zM3mMSYk_5r7nDC^2n?M+okY|$JzJe));A66P3H%$og=)l%Gk}&sk%x_b8m|(UZoHsNxd$RyJ(0 z8PvUXTmm?^J5Leh5I0mQ4@{b4t2+F+yS+9Jnqqb6EvzM#7-BAv0u`%Uq!mB~8cA>N zZ{&)J(}}l@44ccx*I!^!$nNgI_Venfu4%a65F=ax#t>X9cJYlqUoXSgo$ykF*IG{! zu97IF#FBu2OLWF#b6IvMF3lSriFaZ0?z6jv1qDe-=9MAlV3m(mFe? zk7kZ(m1JyOQ*=&qHRtn-1A2FrVrHZg)JCT$mB||i` z{}g?`Or)=%C=_}Q+5uD8dx9HJA-r&C6CEpqD9qSg-PEqg{srkwsn+e7qYEFG9IJ=a z76w2AgwSPSo}%eP^{LU8-vF$*Y)!Dm`%%7h%t?r6#Yf^C-1z2*k`Q%k8X_08lp=pL zt5YP#Dd#yH^9}bkaA)lsa(Fu2t}CTP7p)+fmlvdIF=OIa@mx`ZkWJT+VYM>{=eJEW z*DQ*Sd2e@oXK(1YN~hSnzZHU{gWpQz_sAe&cwwdt!4HnfGQ|=7BK1?>;}U+i)%%9W zG*eP3{k%dU!i4fB`}2(=Zeuf-@$hywDWKt}vzn6Q*1(X`N4a37;bx#N+3#({yz;xd z;c{AxCn3ioC8}1)p7JbE1#_+WST8Xp@rLlxqC*AZD+Znof^*@2OUOTQkPdfASP32; zNN5__v;=9cp#{N^!>@|}1ze25ouil}iv^%{^qLvpQ7vtliK71D%q9lBYKEY2#;2F^ zt_>>;w=U?&QrDjbfNp>N9f=`6!b<%pN+P7cB{{BtBjzo~Mq&*V1+ROhsb^yg+#QY# z1m^bJB?Gv{1T5^9SxiowIT{@(L>N(Uo^M-6-S5w>Mf^5WRK<=xNZQFP;J5;p>^rdm z|76H9JZ`Ba-G(AgnM-iY++1huL^XUwQJ07nD2^G!_5v9}|3#e|CrR+nncMENU%p&t z<*jfrTBbd2D?sr&7d#0~+S521?$SLALb==|f;*?8K8;rRSy70gOcN0^&5jVfzwEuu zmNd!J&ntZ*nKvd=v2rNZWcr1Zsi27_ZQzp&_eY9{|I%$3+0#Groy)y^#!O7?|LBzH zwskp`h^^HT0L*Qp=5lLC+qrA6($!;6(Zf&;#jfp4Q1zn&Dnz} zWbyiv4#>FekIu5{{%`p!aT%LEz*uSK@)g!BAZ^;~vK$ z1EJ3gbv4^N6$$+lwcWIzXW1SFV595C_-BvX?CjlGTl?qBhw&0luw0oOiCsWb6EXzM+E3iv#BLRw3I8Yf3n( z;_n(|HNI>Dzp(OL6U|&McN>yysr2#j z!}m~g*9h|!YSu5|d4JQT_d3C-R66g@tKcPRiTYX4lth!{4Xtc0AirQdJ_p;fapxK? zV-*@uE#dvFer`@MGG$01v()|Ss=mt*8>Ol5*Ny67wajJ@>r$Y_{DG4^^VYq=dA42? z*-`>VJDn7K@Hp3z^S-@#tI#%5xVO?clTI~Pvq!P6yV*KaUV>k7)!!KBf-gkoq3V*O z=U+(K2+92FG|8et>uqMq#W5G>#EE?i@Eh6{^x45Y_$TV@vgz`pc>n{{WdpK!-UPy2fI6yP`(>EzhAVix7@xZt+p>BIooRHWeS;>?&=6m zoo@2HHL=rHAGQ5}HuYOrqr2;4DoWyw!~|xa{h9J-XkqY$nh(!KRE5_QqBL}4RJWN- z<$mXT^(2`fw;YhVmb(jL02>^zxlnGi1^kz*{8!Xx$z$Dk6%l^N=RTX7#vtIehvL68 zOF^$JAU6tKt^uo`trX3D_n)RR(?_t|9gV+VR=)4OHi)x1v;|-vSavj|qUNs5RV^BJ zv>8o7{I`sZ>pW-tf6RWGlw1le4yb&CO#WP9{-pe?jp;_6ZuBsAao#jyT zJ6DA3ch;QOt@9M*knW3hG{p0nhAh*Fmi7+d*b!|9c@HyI@4*Z4sW$qwvAk0 z0!%qh&#o6s)lX)Ku)Au2b1|bavcGrr8AFnGo5Zy%lk8U4dl{n##IPI*MjR@R9*HOj zJt;U^38QsVrT-%z5m(wQu2T@@{(+W5aTW9RYEC~>f$TlDU(fDb;hpmtxW4AEU%rlf zL}qQu(*mZtPM+~-C7q##P>(>1lN{d-iUJM}2r29k&zG)U4oFdAZqH-xGiCI^v(Isi z<|Y@9{=!Q8v|YvuCJ$W`<@0*Qc_>XcOXseSJ!sQeAItO- zp2iYn(d4Ft6NGZAK0vm`FMzE2L29uyqW$6VQ}zv`2uJJ{>VflrIYc(!G12KtCZ*7M zEhA3z!*a&+KS`F1%?jV$v4k~e&smZSn(RszdR$`TGQyZS>9)A%tsYp6+1~dC)W9~C zeYRVyuW@=HR@Yr$>6jy?pf=@<$woc0>vDXQ))N|BldgG(f1(bpg|t;++@$tK_zfQ; z+yH*Kf78#^b&Q>VSQm>%LFS|OFegcMO7r9*OE(H!%Qk3YVKRcasHw>YSe5>`{A3m^ zf)aKYjpawgXI^rgA5@?@#?+TKKk1vs#jt6)Kf%vK12#jW3s^>wZIK3$-i&X+mX)e> z;LJK?#uqui%P?)Zfxkj*&S$gBAa&W2r1i2Qm^?{Fj=!r002npgamyYQ=sfWey8iXQVQg!eeh2(Q26gt154cY3g| z@9YNreyigM?;Om!1{k9uW=%9BIc?JbeK@_QjIuOKVp~xfyIXlc-Sq6=X|o@weS6i~ zABi6+20$Ef@e$2`WS&(GF^Pl>1?8O7gK(0qLf+pM(-0>9;p4*nmfh7?Vb}mX zwU_|<9e$OOR1o-j#X|U8ns4LZ(F3|oKRZL1uiu0v9l!Zc(v03Whv=tsruvHiiQ2y1 zu-a92Gh*(sfWp1PHbz(Zc&Jd7XH4s0LvI8rzIadhjUEUs0^o&J+5G}K(F9JC5lcJC zm?1?c8FP-#ii9VjJeEDwG(a8gT5%mY^E?W{4ofr#T{7-|=49*&@gXp5?Svz<4YfPR zWstTRCcl=8hylXM{N)YHzYrsWWqrlS)xy^rvuMb$bmx^DQsBhue+-%6dS>^aMOOqZ z@8hhj96lrA0KcjU;a(3p+u2V=SnQrDAu%f@ZqgOvoH{1urCja7>34ByM7otwF-%l} z;kRl?PK^n-WG-rIXs^l>YstTwjg^6<3@%6T@bkw}=c(iq=WTh@1biWQGGR<3{n>DCg1 zKgPb%Q>b_3P1^&(6l&6K1SQN0C$G?W3>p7sH~AZxe?q@tMTW}dUt&C`5aCHs7W|$f z$)2Auh;`!MXZ?_=xYXkO4cu!V{ja%vw=-P!3 zB5NU*y`Mu!HMk$yVDe?f-pQbcbN)w5y*S2*tWK)6HO##sEsB5Bg2qS+QhVOqqcTnh zPg3dgeW)ADzwvZ%8^dn*)ZyH04yXT?$+4~{n>7T`QgYgT9sH6aaAP`KC_OrIpStAg z=WK4?(|~`?iro4ec_$M=olF1)X*nl&8g^seDVaoZ8RCi?_V&-y%znO?B)Cj3_kYKb z!qx|*J1ny222N|R!4O6&L)_Ztx*BK0{Ow`v;qSPT3DH|7rzDWr-KRtQzD8ejONzke+hh7;QA_7EAeQ9r0&BMXn=c0OAz#6ZgyREBif3CLB9Y z?B&x>IzQneBvuR7+j@sl)w1l~=JevL*1#MQNF7LN=QdBv!DPXF6c)z^`=&cN?CgBE zAb6IS;pP^4e9n-}Pygj#(!nQ{@-03BQ#A~9ymWkIc`0>6@sMa)dmwdue79!D=0D(`F#x#!=y{gq0GvA0*njsa24MK+-DzD zveG06M1Q>W2=6;i8*zR^TSxW$|V#U#-_q z%HE;6Ph)z6kI(Jbe+6zZmz$KbpqA$9E6~g1oa6bO)#|{#-eYvlv1U+3k9dw{MTs`` zcnYHSt*t864aQR)y?X9&UoVMmTv7KeHSR-WY~3i~$Y-7I^fio{%YKQ6D-p0@xL@P4 zRRvEEh0nJugkvdojlmk&RnN;h5H&(gq)IFa-Cx1EHGToHbU)GoKU+0cClZT&&vL>vOjKpC07acbX!0hTck4 z3b9s-WRU6;55!Y%{Ch6vsJeL9vX2Rh4F^ld3ziMF0Yt*YP5so^0Cv}1@bJ{ZgsZ~c z*3It1O}Rg;dkM!&3ABIh{ti0&;@U^!M-s4xgNh*E;BQ+0ZFG)qcahWI8~V65aC2Bn zRIFdNty&@nz|GpS;_y2uylrIWV%e$alLZ5*F;PWFrhz2HL!d!0Qx#K`+kI9(Wz$qD zK$gChGyv`GCA~KARtekDaL1Kj4dyzlmYt&-kABURE73{ki0#Q$MT2jd{|ytKIKZFG z6wXK^iv_Q|0uWu^#_G@~ZfD(CHt>Iz?g>Sag?`^6a}z3&?eNUpQk*k|Gv%$CAh#*D zIwZ>Zh;bzTE)K&K>r8cInG}*aeRndv9t>Ad@T1Iouc10Kz;T!)TmbjuR9weYp_hjlL}nRpt) zxKF3>)4y{BEts}90dNTopSTHY$%k6UnfvlBgbvDflx0*O&*F>lg@qcT&b3fj1mS() zTZF2`rR5%a;=kYIBj?jIUF;=zQJ{)3a|IbPTD<72EW44)rH4m&{ZOMKLHrAme-xr| zn4-yeeiF~xT4ejc^9UaX>hU#4Uc&1y>8hRkxR?9ox!@JgrC@odFgT};Zdcrp42T(3x@80O&LbS+U#VQXNuGVYzsX;PTV4_l1Bu5ff}PDB`($0UgUq4b z!cX#Vh?mQM-vMOX)BY1XNT;5(Y8>*ccFB*$God(zou4^5+XZ*l9eceM_NxbcPc2RK z#`JVtIqSLk=}6v2g&Wc*?`1fz%gP=xQYE(p0G@MA?IrXFRbc6zVK2SB$i@G4ct2Mt zPOdA})L>>T^IzbyfuW#;wpagE^QE}x7~Q4ZU}Iq=bJ8d|AW_ubo{;jt&0z67uS)_9 zDvP~Q1k-Lu+`Jr{Oi~wbu~xbSShK|zJ7lB#hjF?rCsXX$wgr{Q`;Rbk>HbWCQhoDo z{aPQv1-{3E2)w`ZG>Joz5NFPQ5hsZfo>%FX^>4;x?Pb-M4b>-`cuqV%DBpE^JZ^`P z0e0PR2H>4Zpa*5^Nl#FTU@)%$>P|lwB_lnqq<_WrlfV@h&@XRm4!gQ}+CpQ`^?zapN;d&%YRC4+^T`dtz+$hb* zh1|B!s{eS8#ud&`&A;d090-df8wku5Sm(8B_5awrT>IcSv|W8tEXboCcgSrNxigNw zPCu0){Jq$098a)-=&uh}@iio`6#kKJ+uxe8>e1;nPe~;{j<@{VnU>H5;{{Rj{IzZj z?}Bn(Pbpg!Z+$n4sB_PUKZUdn6IvcUEc7V4Fdjt%|F9~rkh|jIvo{95W9s3a9Pq%K zGG`=fJY|I0^(guGQzxMP)FQ;GfthuI)U`Gq|JvYj^KtdV0>x{^&{%jb7WJ)RTbkhA zdr-GkaSbIy33a^l+c4S+A~*@TC)mxO_%&(W<6+I?(4_*9mRrlCx*}Dye~SCPRqcWI zho&MQoh@R^^IjG*a{}hpx5nC;G))x8MYr2)q*mU)e{$+(-^IbK;6VqG5{( zBMiZS3|c*?|Ja;K2|x8iKo_=}75EKGE02g;CtykibgF!_Z0tHqGxcYYc2h%psKLPd zok{E-?5w1m!;`A8psqr3#kq*lYMpZye~6G}dn^~t!$Sn!QLYR*69{fh^xHO3L1 zd-p@SJH+hvlCW(>5s;3y=k*n>#lu-6fpGA^38Jpl%>vLCG};ES!z3>@lR7_+w})%0 zrjD{*oj`6#UFv7O0R2&l0=-VNRsZ9>orSM~0Mzgnf~N)@_kmU>&cYOkuMMbk-)ijz zYDU5EIFDZji_e@a?*u~k03NNZHT1O_N3*E-E^1wlB$JAkk?DpuN$iP-Dxt8U1(WV8 z51SI7rZH6@!be)--hc6qC}GlLy>zLem!Tq;=hWeowwd~x8Cn%yUrQV6i=Ca*qMl`0 zHzVxNLWy3MfT501M6Xar-*D8NF z{uNw5aPI5uPXW)_xl6+ZjDkis-uUm%q4w*ypbA`3brvIet?Bgb7 zC^cWbSw*%%2U5HzC;fV=#1r`UCH<g9ebThL*l%a-|)_RJDaVV36DDxeWtN#LC_3-Ma|IqiIwhD#!c~A%jMtxGYZ)cj(py43cSr^?a_AK)dE*{(>TTcmyKtiM?!<$O!g|3TfEVU zhk{7o8;j;^BA5?I)eBoEajClxQ<96hF;g*6K2mba1fd62ol5z}vmBvX{CkdMnD$^OeDsRst() zL(+8eq@`mV9Pu!eN^)$(&nya^KX;vOvpIbfy7@+-D6v(GeaX+W;4S(YE|7GoTQvJ< zYcQ|ca(3sP1S;!>T`jrRm3!8C8u;DPZeWgra%+*2Q)>h=mOa;wgU(O)qD7GWX4lrB z(|jRVhIDV0Hk$|>)BGi{s!wKi$L**<%)1%k`e zSSN2f10PCkD~$>1ndSy5hgfh21h;c)JumR^DexmS<_pH4ju&ZO4{ze>o*{w{4w70X zHp+G+cM90#(LG~wC)bj`-e@Zu5nFZhPh}@gu0J*)#0_E<3)hD`xk(>5U@5)&OXmyf zRUg9mE1dcZTGgTFMq=ED*Z6J0k%pF@X6syYaDCECK|Y9T{Bs)v8?(|;mz_A{QW)4` zV^igv!h>W-AP-&>L73B8I+zTs!O$-=nQHi&+oW&SL0!M;I@Cxpdt7m1>Xz8-Vj_WL&jWvMS zY5zr=ytxCZ1R0=Wf>K4vWzEZlm6?bGE@aLO_|r(HAb;1gvfkY7?%`_lo#na%;2pqWsuB`7GGpz~urc#O^Ga)r zdCv;Vdt*;$0erfI5U>!iI~Ny8s!W+BN`TEo_LlBoW}Kbn=Y2NbNzz5o|6xY0UNO=b z@1a8)hZenZ696?d+4g22DWCMFka|NteGG!)mxKx3>Vf;x_`ZUVKq#JrQ#IySs@>ys z1ElBHc#RmYJFCC;hN~jE$_OT^vMxG*LR8CyA{a?Ab5qVEb^<_~a+w@LPerbKgnyaZ z%R*5QKWGS7*z4yP-O$C+DVQEIa@>}ZP07bg<=WJ+uxxhol@yd()!Ca*n`#1E z<-}XJb|q{kG1sA{-5fake|p_FsVUa?NnOSV4m`vif13Jq<;e`L;`0zvJMqqBE}cSg zK>9-;MiuP_YbM;-PyIw*Uw!HAP>3VZ8RE^M*!JjAPkUn6@ba@^?e4vn4t}Pz;nWuY zlZCtt4t$oua6sgx|@v|Vl=mJ~n=jG7B{2{ik}U!YDsFi@h_ELv9(>kNDN%iv@C z_DCaxtxm}auF+1}$)=DT4(sB9(Ao;gB>r&)$%Bfph}HL_1Sa)v_S5T(2IVifFbeuA z+3WzubXzD^Rp{=0-jsyUpVZPW^poRd_Ls<1KeTWyaak@c2^O&fp%cFr=HkHap}}Hf zhvjJ%8wFyJ)L>*6d!CYxHM4})+%2!Ae7)n2* zB76q?J@$}JfuqlZTEX=sv9I+DJNJ-+CEx4xsr)O~BZMAxke+LtKb#2TUAmiTDUo}u~@o+8~2QO}}9Ts1{ zNc#JzC`|GOHl$P57*FT}=&v0J%}#x5)Si>vS{!=WS#vYObGwq?ny|pAocHEKeS1%B zM7qcyzQTwQMY%f7Jr82ZS{31WXx^hBTteL4={lX97$az9WKj$Wv3q$npcpcSYk}`Q zK%pMBGAb-);3hLkJkH($k2&2RKM^`CI;G>47Fp?DZKzf<{+eI1+)JeDIn&fpfo&Hs zGyc|YwvgAvKY0MP9rLxJmHrCZ34K12_NFT56(A3C9quodtr^6O06w`Z|EJ0n=xKA; zeAPHEm}|oY*fZ|O9-@N$O&+lnH!qjw>DaVRdLx2Hv zj{8$(ETZGB>CbuV2*f0_W&94sDaVGSJXd!hnjoi59x06`HGhbzF+G2b^6`1pA`bi$ z70!w}z!~S&MyM=-w8}>F-uB`E*3{3}bdU1t0{Qp;yG5~T)02DQotGPLZM+-}udrgE z9@ zDBPd8eSlvvrxNr!D1l5c@iriV5Ig8HH+6OWmzHFImTK3&V!qn znmZw{Kkg^ZRtBbO_2x4r8ME~d%jdF(1l7eY%Fkz;q5*Q)6zuwhy1?Q+vp~0^>5x~3 z$i;ojo$w~v2%1A;*mD7205-Ug%_wF}IfYGR$rdEF1^EpMD_kW@yyBbkYt5o_{Dubc zJ->$+wF@;J1!i%1bJFofD}JN{zlXT`ydZB~x1Z7@;w@h6d1-%iiI+)9Rl^`+VI7UF zmgtT(GuN0`^s{M>OJkFJ2a-I5aFi0NI;&$pE!_U}LQodVq%Aa@=ApM@Nz=88dPWz1 zJqxI$U0O^ow58v&e@zI%IEstY9~hK4)l#dKP0fsxAh<6F$E={N8&hZa>rMTX={yzI zjss=D4tGP#gVkGS{tK^W!d81b3ThHL?VTKR3L|>bDMzbV|lV}}TG=9yw=2#Bx5MYz8#IA}%m9!XK~J7g<$SN{^9&LePJq(`&kAQb+C6S7toVY$>ZK5%)`jQcaoHMNIc+ zRWM?4Si(8mF6*RCkZHstnS1hMSTg&&(_;*#>E-%w~|ENW?J69g-uBWn)&3}I|*e(Yq#k9 zd>4f|ojK{XBS620o;C%n^C1!R0uy(Bzh>wYm-kl=WkE;0_jTo2j23S_zT)(8I@j&r z(NEL(=UpmI)^BbQ_(78Eo*c6B3iG$w1rGtb5o*eLZNH>SWZyv39rJ2aTx;F_1xBLb zj_&YBLwgYzv`+#jtx4RXTnh+dd|e!DZ69x1`Z06u)FK4Vo4$rkNR*GJ{VBh8@bQ4q z$WNC?gIwQ5?cn585H;HVCIKSrAGzr+e&732Qxt_FS6^LswS#8`c56KZWF~lJRa@Jo z|H9ENJb7NVl2aZzESI)z(bay6tC0=jP8lmnSumWwJQ8C1y?adXA2+V(HE_VmEKgcW zWPJx~Y*C`ai6Z2q_9TM$IoPsUR>k#E@#1__Z3AniwhK-+{0*)FEw|cvG`+(`d9VBe z^kV1WJY8it6PA2D6|b`}I&H64rWNF}B7MtS|E5P_trHi(>8cVag!8FqV#Q}}NFI0z zBtu~N-4V42AhP63-@|)wZg;j_vCe&n93DVHp`^Q^QVSrNE0ChJ+z1NPUmTSA_6Tq$ zs*URKQA!%33tW7v{i1dW@~MG;+J2%TN}Jq%?B3%TaB08ulUl@^mynI^l*W{I~n>wSwz`xy~0 zZL9ZnJ;dBe)_hFOu3bEGYIv~nqCDEO@hw^#k? zfHuvL9S^Rp$mVpzryFZh+<}_13A6%Fi0!oziQN> z86M11R%y5*K8NR-IaTc|Lgo|ep3#NKlXDX^7waW z;2onMACPW61o@B*#gIPsV07^kL!Zn!=2>BuayXPH~VwoPl>9T;HErc;8 zR^YRO?PTV|>nV?sH#AM<>N3r$xfof?O@}<_vOF8H#$YgnL>g-i>T;7gZod^>*F{8r z=-r%JPN^engWEl`YOI=Kht9r>-K-_&<7>CBNs<%dZ!Od*w6o{x)V~^Vtl@YM*&M6&}v z?y6bI{H8;MEK)BdWst>gSpndtNq%!Vjjv5fl-7wg9va!8p#rlw3>k`cv`+5yZU{21 z!^B9?4M-?IbI};D(aiDaWl8Vd#}JI@jWbBR)@h{F`Q8K<4svKR(Ps^-tB0{(=y8*< zif-#mtz)Tm{UUD=!Dv?bbXc2qr-g7GuCOze!?WWQp6Ywp_X9wNh&wjQ#+ zEN}oNi&f1*=84~06eC_H_}@F5>&_(poe_-|@DBTgQBj@nXL|$b#Y8S8eTb0QkMU$q z3`^UBT)F|d6J%stx}NqV#NI)q3X_;B+y-rjV)k)0-*HUs_zW>#^KwUW%X*FEO0aOo z%Tr>Py~h`&lFQwxlh<|cOBjH(*9SZe_)*v2@Vz2><>^WYK3R{&iW82K7kF%Ek< zm&RB4z=~VO6|7IWa4w}|E{cg>hEu!Z{iLGr2Xg7%YuL3Q$Na)sb(oFA;skxZh}731 z>}ti0ctA&vTlCJ|-ZQmJA3Xb&7vBq0z7uMutFgW;Zhhw&kKQQPGmMvIe4zb~dr*BR zBT>tshW9?qT(e40!|nni&2zb}IO(2e9m{aJB+?-YS>KEithK6POA}L*Y-tN3EUN<| z7V0GEl*qCPdQS~F-omw3Co8p_Tb7>I#ij1byR#VqS**lE1ASGm&R3?vpR%gNSPL4M zZfCz&iJsS}9e-vSU#j;59vbEP(*dqo``E{xI9`T>Luo#7fNQMbcjmS$bSw3T%S|BO z!61ojn=k-U5L272`?U48f8M3W)+$=NXT1!-M^B635lT`ccn$dHxxOwsIMAJnMB z`}}dEub%{)JL*LF{V?XA z;_X3j3uj1A8(KzJ7M|9v;2*Pc4~I6JfzSW=&Vi)G9)v;PbH_ETzx)}+&gSAOTv<0s zp|Crdvo8yX*#x3A(cUXYO|PRtyrt@LZ_a?*KVlf9?j z7-j%|6-Yj~o*(l~fx`SM(+sBAswf!_V#=RlR-e+t%va*)J0KErz5(W^mYDxG?t!Qi zqcs2MxWRXPD@W@qV2a)P)ZuK&!S4b8e~w2q4btr7Z@FyA_4hd(8Y5#73PZ16?j!Qp z&jpu5V8MBVKa5~U{{lP`fU>u}0hO+1gW)E((taMqBXDq4R^`1k`ajk6pWk+)ddPrH zYP9_y34vq2T9jYU5FcYE{+pBpeoyc~$w!dQ;=)~Afa|eoFDZ+cX^~B5OB^LG3l{&vS@IKLbj}kq9POXTX@{2+^1Sj-YMl;Bc z-_1IomY^sOG5j-U3&2N@PUiaTZ{OWt5AMF4%M>M6JG8WMKzF&TQ24vgse=^ZHfW&H zGwV{8lDJoT`hr*c)laKju?&$s2%?aKYK}zvR=1tvVxm2-s^YH{dTVZ#!jJ84v?(NxUv{i0A8PKpeHjPmI&pDBT? zF8dej5(XI+nm3my55Kb$rHb?^UzV)#S+!ioqLjU9puyezt3G(CbJbr4Kq#>KrN%qx ztOQM^$~*m&x9!1At2lv-oO499YgXifb^Df4;OPT<$>FDEh`il!YMI4*O)6+6b8%Y4 z{Oy*to}a`F5ITwr-bRV(WzM-KB?`T@d-l+95{udV6tHr^mHL&uNe@OP@(}Atx@%G3 z2I>T_yOaT4-D6rB;|VS5*VjWy+`?AFp6`kJpQFGxlrZ@!5r?(j!359ZPb+cKIdz^V zM%CHw0Kg>L>{wT>=$kN-&6rwzmY=RgRu_i+Y~1|CM)=QQtdgQ{+~Xbx)(-Bj9VLA5 z1chZ#jnHxLf;@TC`)lbpc}#9|t>XgN{ZmZs98Ypi9%>-?x=L6jB)c zMiC>7Gv9vH1U}+M>UiE-LppE&|(c$fy}V<0=4++==l?nhX4RL$ zB>p%hf9WFgb5z~%_`HVB(aNf#j zzv4o=rLV8VimR?2ya@u3hry4mx0`EB}xS*I-!PGYgo!7Gleupwss%*oq&)D(3 zXONyDSTMz4+#(CL(L_;pI9f*IJ5UNS$d+PX51>Y=_(g0tGaZ2P1T*|3g@w6(vRyNw z0e5pKKbZ;ON+Z^gb{k*9kJxm+d(>ZEHoEd*#(EciFRxL<(JHBj7$fk7$u4~@UN8yFy9N2kr=!|FuXY~@&v}= z?z2RwiXt$@bM3~dgH4_K10Q%U1Fc^fwjJ2jccK;h=+%gXteZHoYDr!-sG`Vm%N+&E zGISUwei;~&d1$td(X6nbK3tcHs!~XQzw)iA39)K&$zw5b$}UQ4s%NsSt}G2oe|(JL zvRZDxS@1~onYrvHJ7$9ruxV$E3<qGn(3>#t$)9su}9 z9XsHs#4mqUH=efOFSP@RLvG1cbh$fC%N-ep6A8PvtLYyi=3O^n{x=r1Y<%wl~2(N=C#Ao;u?mw#l-c%bK-Nl(w} z*CV-=kw!`&d%f~J13W~p+pmy%W3!;<0m?<#OP$&L`cA>aALfT=4gXFl<9kVJD@KwX zsH)k&ddVJNd`~wXdp(=JSV;9*gt+`sKu)KZ9z{`IFOqpzpr(|_vT0VTxbQagvn zrS}%{_sl*xBjl^m~ZhR6Q-C!T9qb-u#_J!uM0~& z?x~z_YVL>4GSzIL_Wa{~_oxEDl{J0O`>HSU21qP^IkkZ4v^DFSqgKnV{L0j|IUKA# zTn`{xaR7?|1hwcD5nOoRUDCT}82xCollrn8q`w(Vk)kgN&|?P8F!>U?H`-D*^b1La zCAMf=&ZaJ_uh?a-zQp`9fGYA~zSGBmH^XCtui&25MKwEhzPgD8@!9`uNOQOZ4U5Nq z+~_d#d0BO&OJDVXGTbouErmdJz4sl)&j^h(*kC;)fgAM#_l`(D@2DbOZ#1K?zs>zrpfMJBEi7~h-%sa@CSv9+bx;j zzv7nL=qtT0P9N!q6mcG>E95r5J01M2S6RQXmjwRiFM!$&ycXj+a_XI+p2^OKwa(-> z?RHres%ODFYS;XAWKNRe&(9OjIXOt(4^xo6pbKwyO#A04uj!e(+;zPwQ+o0CS^bQf zQ@*U;@9peqt4h?M@2~a=KMvR8 z+;N~66sQk!t8by_oB;3>1`4ZooS$FN%~FIv=q0S9L=jfZwZHKso5|pOCf(0 zKm8&8{O7x~(glKezZrR3a0;_-EydMdjAdyc5SNgK#Glt+x~u2`zZ+i)O~CLO|`UY9Z+6@|16iKz`!8Lgg=JrvD0dTiIyn<`yjQl_()yTRCsRW79U5_0v8S74WRP`NYFTi-)3rJe~b z^E9HRlQq?bjj_&6W)y&EwYn&Cc*GgCqgb?^aaC*QsPGxP{z7 zsNQS%p6X70e*yoyd~b2cexl;b##r>rP}1)V=Il`TgKx&A>id{+#`+&jc2+yl{;=5u zNnG&mGr^4+rb;(fjk6Nlln3G7OPl+N71g-CW@C_nwc21Ni~HHE^-%5_Tc2?FMw=dlN!B_o+$v*C>#X3m(kB%Q zq$Sw7y0DErU&Z@8-M(Ef5W;UpvYD+hW^q21)zb*F4zbzqf{*tw%V<3w9i5gxSb3K`>}NZ4SpnuW-u9DgkbQ`XL8CW1%6Ljv8)DDmrgOx3miNQP}5=O^QaS?|I z>uJOcK^5!ywsu%s#$LCTdf4-1lB)e~>6tIu8XgN@4JEULjpeqU*A|aOCya8gwp{oq2JOdf>f3=oBK6p6+dgjjFEdsb)wuMLfKh=-`R?(v z=X0bvSZA{FV9KcMVkkd zhRDbE0dY5`qgchKN#k*R0k1HcM9%LT#zms-$Bpgm&?r;`YHAG(_dyR{f)idYZHphf&2{(F zWJ<8;y$mnBnVqx8O~`)lb{RvuF;O#ulYE#!0D4g2bl41r?7)}NpYRW^CL{{D&jt7h zYoH}QQ>D`sp8;HBae|Fc(W+UX0|3tHPR2cIdbs6e&gClN4WqfFSJ0(@y@i1eG8hAzP% zKbRU;>Ujl^*G8S+12SBFW_(i|N+Fzy&Vau@e09-eFh6FZbmHgqI!1Q#lH_3}Rkcs4 z9W$bPQU+J?RV^zBR#}Jmy=3|80p)nu2~;z`#Q6;qpMkZ4WsNq8dO044D}KV z+#4XGr(29c2H$49F_0E3^}JzW)())u z`-|hTnbB?@^JOKOm-Dqo-x2j!OtHw56|QoGKQF;dQA{Lz#P4$K!2EeL9OaYWY^ma1 z4j2vZ6TU5~V$astiE*G96DxgxAi>*Oe~HHQ`l^pZ4*PdSfe zHG*W{@5>gVtS=n2i4Rg*pf?qoH^|6^@KXJx#~cnZ{OHpomtWuCACU-XmS3v-L&eym z2Ik-P#j2I>9CN&@c9_Nks2DA94*{=8CRH?Uu&ET5bxOWyxqG)YATyd3WXU0By~s>I zhL_H0ZwQHf)_s7G0mz6|EcbW?oto&hn%TVnowQsLOMhEoCP2^CB^AN8Ra&60U$zu_ znNT-LolNu$lK&Lz!S#^P^czFdx_)=`L%CI`jkCjL^Qjtfo`62!)SWvd-(UVI8BrWB zKiWVC6sIq=s~duu=%iXZQ^%5PQkatSg)geT>JIKT;V96bn~%%)KTeI+ZLA*Rm3n1p9Q%mIQqPcNZZ!q*q2Sr*Mg>`*skj7#W z2e{12wp7g_fcXQ9en)>MIz4i5)C%CM4;Lhg9S2Ib<`!AA%vTN~fltfuMMK4EEwptQ zt*`QwNq0xq&C59^m*UMU+%L{6OJM*?q`Slz3Y-8E$&l1_HvM8gazG>QC0!PRa zH=^Cv@Y*~BHal8Pi-J?h60WwDk5GLWb-DttgP8rWC~x`k=kt_+ew~5OPL^$3J6mbp z^aljn9tT)}Q^K~V4_iaX7y8ovYSDvOtfu_!>5#FHHJ&yfS>yCpTL|pd8*0>ytxeKR z?iv8_={)GVClAc}+<`}xWsoj`KsB{>l_%3aTFa}|tk<+Fa7nhWI;dhP#+yu_ABZa~ zSH3w}#X{lANVBf%CbH z)^ZV;?3f+Zz?AT_+C)ZSK4XQsmt5VickyKyvfe>3pcL)sa=jy zs8h4)pdZOoMV5kOw`1W8$3K6BU#Z5yfVUEt^s`lbH&HL7B2Oa&(sUar}P=v}hz}@U`N~UBJ}o~ec*50TqO3>5;eD}Fu4867tw8JV z0=6S$<0UYhiv=bkz8OE9@Ylyxj6 zFt7AN>WvtS5|moy6UOP>yi(RSaEKh*nBrO6Imybx{aB2i+3$veL%;wi+<}YV#sWxZ z?t5H_P--0%Fo!!pYfEd}x=z?zJ{06|rfG0DEX049&G)EyhZP4L%%7r9L`1c+9-$uq z3YCSz;$IX`T$K3yLU+O?ZIS%ScNX;KpP;J;6`Ls<^ZBvCfD_TuJ)X?OnN20!pB+#Dk6$&%#&|9S!PSRxp36?3{|Q_=Q?r#{v=nCfH|q!l z3+W(0uMrS86a4!&fI~k}Y<}#trU2ukf!EeO@Iuu3nei&RqBEYPpGSrbVyx=5vt2_I zSJL|4GbuN%mnpBbC8b`vqW5=%VTzy8WO*48QHlQ_8)K`e&{A1bkRwnL|w?aQnnw zN`z90YqOZsR}jc5IVl;W07M=GTEJ*M{G+`x2RW#q7X(V+k1CChn}95I7;o-%^j$D< zDzg!bD(iAqlsCWk9p_0>kca**fegHBkt4T%6u~OG&0ik0j`c|;J&`-)9g&8ExlXs4 z`bT4VTtzXbcXcZbUDWE<+hXWHuM}f+>PRw|Yw8|`*;u6$`!~PB&R5{QG2U;;X40?2SBpUx`Lg$Pe%!T? z#3xQ9h+alqGCC@yKBCLFOZ+vw+gN^8_k}jREcv~LTiT|Z`xqjcsv;*C#AmPR~RU^@Fv-NJD$ytScX}^Q*G)IGd<_mUJ1i zZOzA>wO;hrY2w7*8F_GU^3tMIX0PG}YSdO^BFFqsXwB8W5@jb@wIp>qPZwdf&4az> zA)k6|z9y#?+c*HnU$9+!pNyA@{}sFp-izqRMYZ#g41b`W`czg6Px@DNQvuQFP9CH% z`)Xh@9Oc`l7iC@S8I%@8h}VIr z-B+HTa;Y1LQL^>Hw=Nj}=yz(dGu?g+>4m7Fl zfKHwD=_5S0GhZpjonCa~Ew!5}AN4m~aVd!4<>OgNyQ$i&z`h-Ah-s6}8V<#yYb%SVK_Xc2#h35cyV|PnY00XPI%Sd0LmJMDz^DTBrO+75j z>zhn}S|%Zh{Yvd4fO)TCJeEtIYup+Qa>#xJO{!JN)h$umF`ui5oR#8HbOwatL@rf! z?T_?3@S36AM@fB7Q<*PXGM6>;SJv|3YFIa!jtdl;+y@L<_D@cyb7K9Bvm^Ff?ECmN zGdkYBZ0y21%&n-HomTV0>^IO9z;XF&BTFyo^~wk$Y~c|1pt*W>PyAt zJtd^rcQ0x&@o)?qMvAw_<=@_bNbdYH8?v0}V1uqQ5$T=yDaQvPW(uN~mQO+3BMm`{r99Wx&1w%M_OPY-CVtjYbme75gqR%ftfXaHDS- z{KO|2-r2(+iP}0!*{kyP% zwg?2=>IlCRV)fS!Lb+%&vA?DO>Vmg}bS8#pI-LE4rEDyJ>fd|{cvTZX0SZay_Vw?C z{s_25$`M9@HR>2Ep)kT|&Cf_1X?)}Ezk z`fSf6cCbyT$K*XVZPY^78vacsPcbY#yAmsS?zNei$-%uCj8AO;UfWS6Mp?!PF6bD# z@)U@2%Rg@Y{U2cS_yGxj)P`N1%tnv3iPodq=8>aw0;XTePAN|tlXA>d!=Fmlqz%1t z-KfYb>Rj#lqdbh8;+H&TH{sDIV|)@x824XmiiX<1n*A<%RoqVkJ5^6hbMTFh%xWLV zvtn=lk3ANh^vwZKg_Agmr=Ga#A?`QNDgJE*?Di*h{3)9Gkl>%yb1aUmLj}*PPuPN0 z&hq@vFGf@fD_I2Qg;_?s4mCOX zJ?=mMJDV!zi~}s*%fTM@@bcmp*ZIhQehOIZ7&X9%A?O;}bE#h_pgR9bUqp53jP8t1 z{=B7}!oB}K4J|%EX@dnE!IO50Bfk!J=N&+1`{V3@ACaK|#K^s>Lf`&(sDKpfrtdFx zI_=!0$T!W(>-q-I)O!a;o-h0o4qlkw&d}*fZPNH^7efBMkn2*Lmv`LK-xCgeuTLt#WrDGMacFt$P0KpD(Eo%b zxSn6|jmkd}zW#4_ zfDn@D5C8Ud1<)~lbaMAUmt@1hynph%%~;hR-o)W<`sz^Y>cNa&KevnfE68%pSC6u& zv^;q2%_<;uv;?x;{hv+#LcR2S$K^oMhPuba7h?U_`~cr2cN~Y0yz*}u$0!Q90I9X| zfO_fU|E%;3rALw=B#h)TqsI$)3lVcuo9p8Lw%WIm(i=GW9TIokID*pRO{q$68Bh~* zK1}~7-6F}i^wVek=X>BPlnR?)s*0P_CqjGxX{53Pzsa!YX|=&&X&jZe*X*p2sxm zvHs{he{>Lm$)CJlT;B=2Qa{K6#$q5nP>?K7^9H4fry_kS1D9HR{9;p!y-tj|UQ z2acdd97`yB_d^%vaPgtZ;UE#P%K(iy@*BG%4-c096NIQ1?)~@u2a=RFXH6K}Z6HE~h>lYJ^W!f8=fd{i@uLM8dHy6&bs)pv-v>;D z3heYhRt`v$&|(Xzcr^aUc(`DV|11G87%;HYL)@YNV;)?N+vkRUQ-nzlzNk5&_-vG@S-5LcA$_jNg-N%xqQFFtp^s(P`kN0YWr5n~@EO-T zX&H=5P$%aY`Osocj6HDxLotPb(;en;j33kfd7W>_!!xE>$Eu)Cs9x=?Uc{n=>^J^P zWo1s6EKw$9&V8E?!ADDGpgQN}_Rt^(7SO2U$l|4(n{lSTCd#0pzoLYG>H#-RJf1BB z?d-UOXMlDy#54UiCatXzYm-dpmqb&Kl$u8V{s)a06Z22$^aJb&n}z|(GAABxhcP_0=yN{2)vsyfoBcv^%8>olo9==)ktLD^LW zyiv;5l%*f6qDOBy+sk6{+9iS0VNX$-XUecn;FGVfLHFD)-&}(sh>&KacbLkN^aG|^1f^?RSvrpf2MKWcf{oWLPn7XDu z47V9J=Ek}xXY>|CVLUS%y$h{?ZRYwO6U3R=U%pcZWT`ckbMde46 zB6T@q!{OSE#ND@6IszR0^%*Y1u(0;|Ekt;2cZ3Z}=1!#yHPI% zKlW|&FdA_J*2(rj4!PG#q2JXomrvA30Tk`QA)M%NU3~tzFz*>!>42(^V0fc#x$~ro za?WVR&WxR33wxg`VczyUpvMh$q#`w;n;9@{}-*Cl1FGl<3zWG4Od zHzsE)z>4ZSkMSI~zv6=o42#I(Y7M>C#ds$1^s(lW6!)+ofr zxSjd{_|M^ghgb{e<<8`5%W@W#G7lR}V!NLB#>2fHcAr!z?zt)&_bb)LjG$z3(f4V! z{srdiKb>RV3}Cgm)}%qJ{R#%`(bh|N#}=HYZ4f--xAr|mh z!Km`hY#D3JW?vM4)|8;>&5cd%ZdaUpT7ZqZH*Ql6Ocly4dKd4J`4LgyRoDO)c#-7Z=gQL)HH5xrxV>di1A{RNlU7v~HP*kn|Ho?p- zmQmg+|C6lko!$1McQr-@6{ZzrFo$3zemon|m4I^BiBIO0#a{p}W_w-9n9_G2srRg& z)m?cN&r%A>!K7fz8ExhFaK|it#cL+ zB8g=-KDLL$y9$w7t%kg%h+wa#+{=<}%=vu6sl?b(6M~sl`?Rwvz-A73NgJn)4*L~0 zSa+X9*(JGKxlOJQ-O{)$UIVvz_w;1Zo~-o_gOlxeP-E$$TF!K_!8kCqQy$Sv6@~L! z{q3*_b9&YvbmE*g-?`xnkyl!jE?;>X8AyFCL}{K&*@)7kiH{q7{30Kn5ycbAW{ZZm z9b63NR(;9M_O8i`4>T7CyAgYydf2SF7s-M%-A}^f!YXQwT}*lr9%mvu%_@Gj-C9%= zepV(g10so~CT!$^YrnNr@2Pp&_?@47Yw?K%#Z zDU-M`bkj~Mqu1o>j!*^0N~qQZORy#TJJzV(n7_l=72H&1j#3?zJr7?$!amPERb-p!X& zCgLPCK7wLR?D{a+2%{&)Wc4|ZX_D;vz=u7d$if!imnvMCyp!vQqcHgJmOSQc|*Jp`uJepls-|Eq6mDQGOMR#%3!*pN4Ds!;9QCU;1d{T4h&m@iSVF zy|p^2eV8bZgi&_MVkee34c^noff%5>_t4D!PmJ)F-3RAhheCu)*vG! z+#0OFQw;Zd1$7-{Uu?eg|)WCm4RV-*h)RZ z6ss|Q6ngGa#>xeEFg=}UPyL*_XCm07&w-Bwxqj`eeUdiJG5j4?9I~Fhmt=3VjPAX> zUM}U(^N6EgX0B4gpddcf6k$ku`scn>xnw0fOJx0Rmp5%wZ@lJzoJkUVVrN>@!c4*{ zc9VO*pJAO5i|v)@Qreyiby9!8WeItSqBbWM{!Ik}z?h3W#5p zH&#;GDj(v~Cope%7tqG(h(h`4!*OQc_A77A@Juh#Xz^O(_t`N3K4m^kx+UgUu}`)SQxq2=Xqm%TuxcZu+b+DT}OJ^0JiI7(9d=nBgb-n{I* zb(WQ{%Sod)F~i0w#cGQWoOn)pVE4+WO!8d}Cs5zhVq`tAeRlj~M@5qsMMgW`PDCo~ z%z4z9aWlJ1+4nQW48bX8qOPvn1@_PVU2~6hIq`kOcgcyUx7OWnQ<*eTz^vMtf4*TL zifve{`@tP0c39Ib^;2rgV%LAn$`=ss6brwag}!^0dEOCx?ft8i(0ry54lrS~;Z|YG zTv&39(GJw;lpySKt!YSS!^Sm+#@`>xuuX91rR{t&o1;T`L3jakt{d67yV2!OPNKx; z+f$8QxE6LsD&u}kaQTn~N$_#wsq>#*bDlKckL{r@n{;zGJfj!ULY{=w2npzX@8ikG zs(<8XoQ(B+Ymf7AXKyr8KZiVts#D6ZbsFoL?RXOI`60-Ui9hEMO{lVAxGw_3-05@L z(@}JvOl9DFvo~NW^ifvVbbO z02J9NoDs2D{BX{sZcue37`#=8;TDuaxNqDwiYv@dT2_q?cQ+JzZj7PGuY z-bJrQQ3Khozm=>TgD=l5tm_HVUV@>!d$R{=#n;}{`>H#Kc=C1nqlU5r?^_%ilvr4D zq7N~aJ*d$xhl=YNsJ|~2l#APvPl}apxw?Aob=Op?dG$5td)^miK@Rip z#aP-uw)0lT!du&8lcW9Ugv;ZvLN!`yVvGOO=f3F-_XT0imIF*;<;qzcL_vB2#A?kZ z)2F-OC)V4w_u`2cD+v{;`)WoFJwG!Hm^p( z&fv+=b#ekk)&Gj~(XQ~*-v_}YPNU5G$+up7ge|(DHrc!|^4qf|xJ3|!1o&RX1G#cJ z=E}*-GxtLYtk=$1d_NlKv*5`?<@Iu~GBZZP`+6p0;kpH%qQ4+R2Au+re-TdfaWW70ONlygT<-Jp|RFrX{Q-BAsASWsoVez&yA#dnt4#*_+LfgHDv zkZ;67LJ$metwHqaB6l7oBL=e~mj8kro)0X*_1KN|*>9p5vKd`{-`6o_zw|EAC)sGL zt`_75rVbY0*A92P_rz!_bhod_Z~|EuW(buL>!Mq~-IdaddbTy(eR2e|Bx!J=^1N;ZYUcfZbTSIVs>s?WB^Lkmhv!i- zFhh9_rWrv?cA=IlAMq^N`@(zlJyj@F%j6_?v|A-AcZtdijj?sf%wL+nzVp#SrnaQ6 zenxmqwGs*i-+v#QnRrp{CNjqW97 zIJBir??_!a2BehlTD5+)9)EcOb6U8Kd~U;BBW8BCU$7O_ z=Rv+yDt@W30BwiBRr+_7_A_ri7Du;0_v|OsTJG(JkW$;eN>uPqbxk1W(w~-Io+zzr z;YQxHt^seCz4w`zEZleaCAyuB%`gRPdlw)BtTo|p0%8inpr!SvB8N4;B7M_Wkgu0S($}JG9{5n`lhAqN z8nTODOjgE?B9NxzPwF7nC>%n?NPTOjF#{{zfz#5&J_*6T3B{@1%l;Doa+@$KJlt?; zZi@b=Y4O$CRM%EJ=h6+8Rb$z)Yo&|0IA_|^F2FLi!2MnakWI_ zti{sZ0@1=v*kzuXV7ykl?G$*N1c6yb$<#IVS2sZV&eaRC3L%W^5+LnoWIb*eOrxK3 zgl&zRl<+Y1-%>@cJT$Rc3Hm>6U3Way|MxGYp@GWEj50$~lwIM9B9c9_$2H2hHmO9e zkrCNKsoZ;w>t2bAY_5@Y?{%$=jIQg(b+66utfoQ7d1IwAqPc!75)I~-FysL5!^6|^P4LAriolqp0nA;2jW1ce&TEy=xquBhJI9&6suvzJt2w0FX^TnFW~Xz%`_wmHCu&Q$#syZ1f`vPv`rdaJSpf zA(Il`=hMavA+)7|qY`9`w^i~a8BHr*4y^6u)}HMr%$2_2%p_BUS@vzPW|iZ}&=vl2DpGzd2x33@ z=?4$~+^ZV^uI#*Yge!zW_VCNdxepmr313aJ>Ja{}k$E0-rb3V(GhM5h8vb4BB9FO$ z^d<$rfwCjd{nBMPgQmoQ2@-O&OA5js0>73wfs>8Q`K2sVo`(kKYk z_nlc!*{oDV7nulgFbFZUu%Ub84aRsT6y@IQ^XLx3oF+m}>9sMNwB+#&-hv=U;gs_F znWHk%4mnC-zhMf2Wc28k@Ij@6aT0EzEPM}Mv3DjFHcBfazez52>yBy-#UWx7V&U6*(Qqg7C3XfQ1`tLGR|WM{18t6cEaRjclV40$#!){s8Y+6X-wkf&v$W4bZjbl5H0voDjlS;esavw$NwbJDE`O$uXaP+{;u2fH@7Xb-I|+JOm^H098JMg3^a5 z;GQ90e}}TUHib@RlNpdwP_Yoef*e}L%LLbB$6BAsx5%+ybqqNbZpUP<(}NqjXT&p` z*s)%OVfzv^QbLkFmJ`!B@=m0|C_YBcsA_ZgT}y*4&BUbmoP}!hrK%N{e19P0%gPm} zYze<6Io;$mmevcewwDMfHIQF zy+t?1n?hUyG7^g6akGI@9UD_yZlJi_0}Nb%MKX7pG%Nk+a#@J372$INBj2U4l6XI! zcPp%?aBWcdR->oRO^qqDv^pyGh`+yyEq;1fG&M**${-YT)ei&qfSk}CMp^u_z&D$D ziIp+KUMZf=|G?Z6kWVXw%S&1flDbccG^>5L2TY86qp7=h^sp&tes%e}8IMXb-QInMe@B{+G4a0wBCnY@zPHxX zJ+5#azC~(aO4Df39`tLeFWULps08Px;#OaCe97iK?Kz5Z-&}YD$F1P5($Uoo{739r zt|3Y+X%O#2u+t91r8Z72vn~#)-RuMqaE_M>(-hi7^l)ilEOFuHR!2Ss?icHvW^1jOiQ} zm$u7H^~HYt(aUZ~^ObZ=i+FB0<;qxUc)TJ4_i{1GwqQ*qIw6@#zB?s4ZQ$YDaWySv zcyTqm6z%9>kLVoaZsfC$b!yx>z0w-R-vNXqmyQ4fakKj>nWYyoGftHFNZ0vkNJjni zMBUy5$sc9U0C_ptn=L!W254_O`e&o*m&vBD@uq7I3CN+tVyTzy?gxjppG7uC1C&(l zWO%*;`nnYSb#LfhGtZJVYov=+Ii%x^NV*i3#>#;m7Kv%2Q_5GB&mEGL)12hUlD7lX zhm(Q{F2}$Z6_Z{a{+(yB1XFa0>QQchw=p(Gp=>y+68Pr8n@$%GjI?)n^tmkdVQQV8 z`?+fyX-=#ZREO3Rhuf%#tB`K(8-RfI-f69{GvmZ+&BKX4?oKA{)G#EY4eo1I2DXcH zp!>El?OOumw2+dpX#kGExAlo3Q`%a*N` zX?!t4fZS@l1>PMrOWltc3<%i6@Du7 zR8hPy@JXx!Ggl7&a>0SBfd{*LIc<_A+kRhy@4PieK~i4OD$QMAe6D0RbyZa|)ZnW} zr#Uln_Qcb2cEPpW!MAHumO;dA4w}sjvHwkg*X_w5{Mo*VMu63SxA?t{2j&~T+BPIr z6|(P?wG6Z7yYZ`-jsoRXiOUW@lWa-Un4VoOwYj^Il}8TMLbteh4w;@$I1p~Z0PD2K z*4p)>{JMRx*P0JnhYbvWo04=vc0v!ADZl!viQ(T0P(TP-P3V!jO%YcBo@QlZI%@WQ zwpv1b_ODzb1ONnK6PLvwn%n<4F-j`xrFV{jFE&YG{|c6dK>$yZ)W}-C_5?L_eLbs9 z>+pkh%T|LJboa7G*wgpM^V)BD+3JOMf+FaxwF-QE*(>h^)Az*RPwIHW`%_!AZ%^XqL-WAkHQqdYukjCy6LFIGE-qsDf3&%cb-@01pq;2NjZovT^wq5#5!vIa)+ z^ihVM4bfX8bM)D0l|Jq)4u{Tvd>Okj`jTgL=z60dx7;&6n7nWI=L2$4P43M|bao!P za7=M*(vzzy+NqI!`cGs&{3650ctLy4cOkK!A>-|?(D&WqGiPVSw3WRi?eZ-Nvr5pr zF@Ia6c+`zVKrxyNZF2JC<&m77HX#52#%X%-?slD$ffNteHRD1l#03@+V-nx}{UDiFe>>*7Oy z3Hd8U?c*If%y{hn-h5t5s>7>ptlw!+=@3^y^Rqu1-djv{dfzK*H^`5ArNb6=YSkPs zo>Oaq95s6WZzOkjj^>5cY^pM@t^Ye;yFE=|$t|&b%Jz28aR9Wl>gYYff^ZyAxnNHu z0aT$9bxVDyA-Xryz+UwLI#%^E|8JRHwTDOdGYwrZVf~L@qaZb}@n@OT>XvM$jazUT;xb!UJ7-ZxZ-SH@j(UC!9w2*GzRbI^vQrhjc|~!k0YFugNbbvv^;aDhg3$(-5t111%k}{EJJW2)5LG zlHUT?sD+E?6i9vz$KB*S+S!5a%2^k-!tR%*aH$G;3(-+o!$z7AC#4AvZ-HOz3@#CH zl%0ext1Fj;oDuljdFwnp?2GbbwWU?O8-`kAR4VoHH8=s zyFlz`dOu};+vK!NWr}pp)_CJ$k+-4KA1SJLmp=%ce31$qIHn9kVQlBTI6D+7Z9|6` zU44f~Y(6hj&^C-SRrUzS!XNPil%5J6*(Ku*4;q}eaLs3Cl4-ExinY+XlJ}LZ9!?;C z+ZW|flVuk>vygfCSsBEw?^X;hyyj5uggnRqKFYwUaJ03cp{xe-G%JM@#@R>3EX=AC zoO#ayApsQ~Ic;=#WVT2PNZ~>VYf95j&oEb7_BC}oGg1^myh+sceq$V#*&V(djG0!a zBD3XtEoUMl0H&1yt02P-HuEa&2l1Q-!u8IVph{lv!!zD6=kbqb)L{u)y10&^5^vT2 z3@g4rkRkE7=Z#BE@-0F=QXb-P{OVx3XTAxzqgtlqQb+&C#|iTa=!$7kI^rbH)!Nd7Hm(Z4M4S2D$)m?HSg~Y0;^mx}n{ELIZoL^&~ z!a>-<@`iSC5xZdza|j9haM_T{^C4y^a%4R_-JAgA>=?fFq@K>V;JkO*0!O13aGH|# zDQxuK44BImaatZcZEfgm?d&C>%dfyKTYRI67C@%PrF!8cB!V`xU`QVwuQH$hVOjgG z_SNK&ONwI&fX7LzEljc|a^< zF?s@W244S#Q-9Fk`d4HPGtV9L$x5Jn( zL*ZvRUi#|!jlc&cd}7Ii1nOH$5Lb;$O+}WISV}&D9-NFLi-s0aJHBu@cNB!^Vgtxu z-dABfUOUmY;zI5b{fK!3*hs*IU6;0ty0C}(6jzlPGY&rv+K0EJHSKIg4^406uyK||3Xjw7L6ic7 zRmf%>A-$5^*^sE!D+|2ti_$}RQC)$$_M!ceTKe2Q560B(XZoU2SG?P#KO(OMJv%dQ zI(Ei?S|`Ab#X$|FvAOD!7lWHu~<$GjU?|W1|dWCHu>+lO7 zXHYTx2+CfkT-4NNhAEA8Z0MGl*K9zDss29AVEjD2J<~>njaFnkMJtv%3!2v@9xGqf zM1Z!SWpM=mPSdx=TXZ=3?iY4icmO~@_`-#lhR_Yjq7Nva8RA`Js84Q|sy6|2^K6eu z$Ou=djRRh*476m~oc8?tDQKboER^7%AAs0}2P=Ut;IHlkXjBW`}C6cV`r%yJdi)?q-43 z5pfE9wDIbn68#AS`XT9Itd(XU=Sb$1uEh@<9&ItK9B^}U(z4G9(7NDa&t{+3&5Rr_ zYcWlcslj=xhn=bVcQkotwL-NY)213vuiPl6TwR$>k3$Ge1EE@#-5o-EJ0`JDNhAD) zTGE)6bQry>i2Q9n^|vG9-P2oTlHwJGo{e5UYSuaNUN^7_TEj?Ndk0B2VR($zFxB&nVy!IhjRI!z*1^m*w#u|$mG!27QOP2?H~sb zMlp|tFB8<3)8Bjhgct^+A?nfO*31w59slOy-UX(s$HLts;LF4F4q9^vdh|`53i(st z(4XCD>P-EunNj5b@Di5Q#Ja~o|D!wga|LUS1Q;#*W^Qvvn=wl^{{hDUts7E6yYClM zjx@6-bxIuh3C1uCtVgH9qftn%{x&@_NYf#G4-xWmY#t zJBzNHE^AiCF+E@+i0bbyxm`>>3d-Gdt=HSxDx`QX*zmn$Lo-vk|GCq=`wLIBzpp=d z-iz8IQ$jc7C$W^FCG1i0cF6;ALCp{-Ui2@OVe#h$;59ztOynMVZ$1CW*S$EbhDxRc zpG)y@7yiLxdIo)+Ct)vP*sf$w7Wku#15f_w=mFh7#C;Bz%_Yk;B>TT5aCe>4x(|=< zWsmzVdo&p#IYRWF)Uyfl_@65@bvFc-716b8V`JA0FP-_b0;`{?%@LQXP)^N#mW0rq zoSLxr|Gh%<^x*b5WoI0kM%D`&;8+7gp1qR4YnVH|6ButDpU z%^y0GdrpnlS5G?_X|T~kd~Urnjkh*g-Wc22F7}fE63QF>*>)u_)B+mSNCdO;onO{r ztFgs3>p!7y$2JyLF5c&oy7jqN#NZ4=`ra%71bqLTF^g;4s997VL`rIOaFg+bm2J%4FaxXLTH+HR?@6y~%wJ9Y zu_MXWswM(w6S$Au@pUUkV^F@e#MH30nXom@HGDoPU1%%cQra6(PFN~e36%+YU(sbx zbBJ+(z4x46XWEjz>@=-;4FH%KE3EvoK5^F^mXL^}MY^QV4}zf0mc*d^jio!GmpB+? z4bmqto4iQfY^JX=)p!fQo4YXdpQ2&7ut3yCdLB>Z)u`xL;) zXbD!N%|Husn7xWOFcZNHo&@uPdNZJ|Lx@6-+^KVyK;Hu)5W{YhFQ4%`4x=-kGZ!5p z@oJy#%>7&?_lF$|)j6D}e53#Ydsj6%V2UmG3A#w9P2d&Fp)km1Yh?D0as~=BGDFCx>U8AG zr=<`^ODin4)k7wxHzY;)L(ec6j}L9&mvoNa8@~1Mi(Q6`<6!yF-E!kQ%h8`cNE&c_ z9)SD4Ft5@KTbL_96K_;Ydfc07y5X7uQh?w2xvE1q-%40^m5bf{1WlEDf!xMxJg~e( z-ySnp57^Xbehh+68;?KOEZP~a8mv;mipJ#!DecX;>$B4dzP>9z$u9$cslF|vX!SZZjh8y zU1751nIcWy^-%O59FA}wflEF`=)zH8317FN1Eu&AZBow4bKgk1{Z!D%)L>@_q-H9A zIw`Wdy_D~egPS8FW*M(gj`)6&Uk9d?38SkAbP@8_zPQ3o)9mA`uw!YQ4zg;$lT#dL z7*B1Q&u#vTf5d7-FqQMm@k+b~)^7}q-=950<;n#O3?$oCP<|6_7Z_~8{J zXh_f``=T;fw-`AD1;;y`-|qRWwe4CBm&q#a{PYZSLBcy>*W;xo{QV~(#RI;q=xIEI zTY|ZF!<=P?_#WwBH!E9SUOu_D&XR$;o6awG$&CMMj?vsV6Fgq|IH}ZtPu;-^VoEKl zxm^SmAq9KFlr(Y&4oT=i;YgWo3ozW;Jy>&bX{z(~b{u^uAqVFxy=cjME2|tu;y68i)>n~Yglepg!Iy#+$w^i zZvHv-_Jzj_004y5rup`t?|y{>hJX?;!}r%X#tS?QY^E3P(EF}%;<3(YOTEW$vFsT{ zew`=lQ@n4D713!L&TA17ez^_D_Ws$Z8u09d{w9>!wguvwYm5!kd-HGJWT0i12S4aR z61woR^901npRQ|bA71U1j;$iQH&V%j#uvrsvUMQnOYg-! z$9)1tNz-FO5Wx9zAmW z)g$6-ue|w&c;@t5XV1PPotv1H6Eic@bE&EMi{~>7AF67$P`L8>)z7Y9ySlQnqG?~O zt*urnrOnMBtJR+yjr!Ks@7vqk@V`B-mVp3pgGcY6XM)ZhP2lWwlF$G9QfQjq=5s>l zg<9O3XAbs%84uHKXA=+!8Vh5N99-VkPo!s z&hdf+_K;e$B?Z;?0qU;5xe?=}_mX@Xah48ri;#m(0n0^%T^s%ymmIXp4{_|AQ9ZF! zOSB=KMBQ!M2qgKVK8n7WbU`%{%vm@b*UP3Jz&@YomW-hxij>Qf%hXsPS2h}o5{?8= z#S}C_wv$ZxD+Xu5%#ItfjQS+OyDjiBp`pH9DNYChZgIBW(PmJMb#>vhsw@fY++gSw zL_CXS%=9s-9g8e!rb%Epn3^VzGtm2R`P-&RMh-It<6*Ab2;%@&nP&;;@6G5;MCnLp z7ZL6{Zy@`mup5`INm!DWTlZ&FF*RK?~}f_tBy zd~rSO&lYcoW=?v{8{*AIl+O*{Zl*`sh0-V1rI;r>yLxLm5qQY*>FG^{*UI%~3y=5i SlEv;@3BR*^uzgcmIP^Ea>|dDx diff --git a/readthedocs.yaml b/readthedocs.yaml new file mode 100644 index 00000000..dd2aa46c --- /dev/null +++ b/readthedocs.yaml @@ -0,0 +1,35 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.12" + # You can also specify other tool versions: + # nodejs: "20" + # rust: "1.70" + # golang: "1.20" + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + # fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: +# - pdf +# - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +# python: +# install: +# - requirements: docs/requirements.txt diff --git a/test/example/stepping.sh b/test/example/stepping.sh index cf574f22..d1b1da2e 100755 --- a/test/example/stepping.sh +++ b/test/example/stepping.sh @@ -1,4 +1,4 @@ -#!/bin/zsh +#!/bin/bash # For testing break, delete, step, step+ step-, default step and set force. for ((i=0; i<3; i++)) do echo 1st loop $i ; done for ((i=0; i<3; i++)) do echo 2nd loop $i ; done