diff --git a/debug/slides/.gitignore b/debug/slides/.gitignore new file mode 100644 index 00000000..7c93b22e --- /dev/null +++ b/debug/slides/.gitignore @@ -0,0 +1,2 @@ +notes.pdf +slides.pdf diff --git a/debug/slides/Makefile b/debug/slides/Makefile new file mode 100644 index 00000000..7e150515 --- /dev/null +++ b/debug/slides/Makefile @@ -0,0 +1,32 @@ +.PHONY: all +all: notes.pdf slides.pdf + +LATEXFLAGS= -shell-escape + +SRC+= preamble.tex +SRC+= abstract.tex contents.tex + +DEPENDS+= examples/multiplier.pdf +DEPENDS+= examples/multiplier.tex + + +notes.pdf: notes.tex +notes.pdf: ${SRC} ${DEPENDS} + +slides.pdf: slides.tex +slides.pdf: ${SRC} ${DEPENDS} + +examples/multiplier.tex examples/multiplier.pdf: + ${MAKE} -C $(dir $@) $(notdir $@) + + + +.PHONY: clean +clean: + ${RM} notes.pdf slides.pdf + ${MAKE} -C examples $@ + + + +INCLUDE_MAKEFILES=../../makefiles +include ${INCLUDE_MAKEFILES}/tex.mk diff --git a/debug/slides/abstract.tex b/debug/slides/abstract.tex new file mode 100644 index 00000000..4012d9d3 --- /dev/null +++ b/debug/slides/abstract.tex @@ -0,0 +1,22 @@ +% What's the problem? +% Why is it a problem? Research gap left by other approaches? +% Why is it important? Why care? +% What's the approach? How to solve the problem? +% What's the findings? How was it evaluated, what are the results, limitations, +% what remains to be done? + +% XXX Summary +\emph{Summary:} +\dots + +% XXX Motivation and intended learning outcomes +\emph{Intended learning outcomes:} +\dots + +% XXX Prerequisites +\emph{Prerequisites:} +\dots + +% XXX Reading material +\emph{Reading:} +\dots diff --git a/debug/slides/contents.tex b/debug/slides/contents.tex new file mode 100644 index 00000000..6a964b6c --- /dev/null +++ b/debug/slides/contents.tex @@ -0,0 +1,43 @@ +\mode* + +\section{Debugging Python with pdb} + +\subsection{A short programme} + +\begin{frame}[fragile,allowframebreaks] + \inputminted[firstline=1,lastline=4,linenos]{python}{examples/multiplier.py} + \dots + \inputminted[firstline=13,linenos]{python}{examples/multiplier.py} +\end{frame} + +\begin{frame}[fragile,allowframebreaks] + \inputminted[linenos,firstline=6,lastline=11]{python}{examples/multiplier.py} +\end{frame} + +\subsection{Into the debugger} + +\begin{frame} + \$ pdb3 multiplier.py +\end{frame} + + +\section{Debugging C++ with gdb} + +\subsection{A short programme} + +\mode{ +\begin{frame} +\includegraphics[page=1,clip,trim=2.5cm 2.5cm 2.5cm 2.5cm,width=\columnwidth]{examples/multiplier.pdf} +\end{frame} +} + +\input{examples/multiplier.tex} + + + +\subsection{Into the debugger} + +\begin{frame} + \$ gdb ./multiplier +\end{frame} + diff --git a/debug/slides/examples/.gitignore b/debug/slides/examples/.gitignore new file mode 100644 index 00000000..cc21eebb --- /dev/null +++ b/debug/slides/examples/.gitignore @@ -0,0 +1,4 @@ +multiplier +multiplier.cpp +multiplier.pdf +multiplier.tex diff --git a/debug/slides/examples/Makefile b/debug/slides/examples/Makefile new file mode 100644 index 00000000..b132ea1d --- /dev/null +++ b/debug/slides/examples/Makefile @@ -0,0 +1,27 @@ +.PHONY: all +all: multiplier multiplier.pdf + +# must add debug flag to compiler +CPPFLAGS+= -g + +multiplier: multiplier.cpp + +multiplier.cpp: multiplier.cpp.nw + ${NOTANGLE.cpp} + +multiplier.pdf: multiplier.cpp.nw + ${NOWEAVE.pdf} + ${RM} multiplier.tex + +multiplier.tex: multiplier.cpp.nw + + +.PHONY: clean +clean: + ${RM} multiplier multiplier.pdf + ${RM} multiplier.cpp multiplier.tex + ${RM} multiplier.aux multiplier.fdb_latexmk multiplier.fls multiplier.log + + +INCLUDE_MAKEFILES=../../../makefiles +include ${INCLUDE_MAKEFILES}/noweb.mk diff --git a/debug/slides/examples/input_type.py b/debug/slides/examples/input_type.py new file mode 100644 index 00000000..52a136be --- /dev/null +++ b/debug/slides/examples/input_type.py @@ -0,0 +1,26 @@ +"""Take input more easily.""" + +def input_type(t, prompt=""): + """Take input, convert to type t; repeat if error.""" + while True: + try: + return t(input(prompt)) + except ValueError: + if t == int: + print(f"Sorry, can't convert to integer.") + else: + print(f"Sorry, can't convert to {t}.") + +def main(): + """Test functionality of this module""" + x = input_type(int, "x = ") + y = input_type(int, "y = ") + z = input_type(float, "z = ") + name = input_type(str, "Your name: ") + + print(f"{x} + {y} = {x+y}") + print(f"z = {z}") + print(f"Your name is {name}") + +if __name__ == "__main__": + main() diff --git a/debug/slides/examples/multiplier.cpp.nw b/debug/slides/examples/multiplier.cpp.nw new file mode 100644 index 00000000..d449dc02 --- /dev/null +++ b/debug/slides/examples/multiplier.cpp.nw @@ -0,0 +1,82 @@ +\paragraph{What the program does} + +We want to have a short program in C++ for the purpose of showing debugging +using gdb(1). + +The program should ask the user for two factors. +Then the program will multiply them in a rather inefficient way --- by repeated +addition --- and then print the result. + + +\paragraph{Source code structure} + +A C++ program is structured as follows. +We only depend on [[]] since we want to read from standard in and +write to standard out. +We also add the [[using namespace std]] so that we don't have to type [[std::]] +before things from the [[iostream]] (e.g. [[std::cout]], see +[[<>]]). +<>= +// The multiplier program + +#include +using namespace std; + +<> + +int main(void) { + <
> +} +@ + +The program execution starts in the [[main]] function. +The bulk of out program will go into [[<
>]]. +Then we can have helper functions in [[<>]]. + +In out case, we need to do the following in the [[<
>]]. +<
>= +<> +<> +@ + + +\paragraph{Communicating with the user} + +We should ask the user for the two numbers and store them in variables so that +we can use them later. +We choose the type [[float]] since we don't need the precision and want to +reduce our memory footprint. +Otherwise the [[double]] type would have done a fine job too. +<>= +float factor1, factor2; + +cout << "Enter two factors: "; +cin >> factor1 >> factor2; +@ + + +\paragraph{Compute and print the result} + +Now we want to compute the result from our input in +[[<>]]. +We will do this with a function. +This is to introduce a call stack for our debugging purposes. +<>= +cout << factor1 << " * " << factor2 + << " = " << multiply(factor1, factor2) << endl; +@ + +The function [[multiply]] will be templated since we don't want to rewrite +anything in case we change types later. +This way the compiler can even infer all types automatically. +<>= +template +type multiply(type factor1, type factor2) { + type result = 0; + + for (auto i = 0; i < factor2; i++) + result += factor2; + + return result; +} +@ diff --git a/debug/slides/examples/multiplier.py b/debug/slides/examples/multiplier.py new file mode 100644 index 00000000..7f8369ec --- /dev/null +++ b/debug/slides/examples/multiplier.py @@ -0,0 +1,21 @@ +""" This program performs multiplication by +repeated addition """ + +import input_type as it + +def multiply(a, b): + """ Computes a*b by repeated addition """ + result = 0 + for _ in range(b): + result += b + return result + +def main(): + """ Test program """ + x = it.input_type(int, "x = ") + y = it.input_type(int, "y = ") + xy = multiply(x, y) + print(f"{x} * {y} = {xy}") + +if __name__ == "__main__": + main() diff --git a/debug/slides/notes.tex b/debug/slides/notes.tex new file mode 100644 index 00000000..c82cd70f --- /dev/null +++ b/debug/slides/notes.tex @@ -0,0 +1,45 @@ +\documentclass{article} + +\usepackage[hyphens]{url} +\usepackage[hidelinks]{hyperref} + +\input{preamble.tex} + +\usepackage[noamsthm,notheorems]{beamerarticle} +\setjobnamebeamerversion{slides} + +%\usepackage{authblk} +%\let\institute\affil + +\declaretheorem[numbered=unless unique,style=theorem]{theorem} +\declaretheorem[numbered=unless unique,style=definition]{definition} +\declaretheorem[numbered=unless unique,style=definition]{assumption} +\declaretheorem[numbered=unless unique,style=definition]{protocol} +\declaretheorem[numbered=unless unique,style=example]{example} +%\declaretheorem[style=definition,numbered=unless unique, +% name=Example,refname={example,examples}]{example} +\declaretheorem[numbered=unless unique,style=remark]{remark} +\declaretheorem[numbered=unless unique,style=remark]{idea} +\declaretheorem[numbered=unless unique,style=exercise]{exercise} +\declaretheorem[numbered=unless unique,style=exercise]{question} +\declaretheorem[numbered=unless unique,style=solution]{solution} + +\begin{document} +\title{% + Debugging +} +\author{Daniel Bosk} +\institute{% + KTH EECS +} + +\maketitle + +\begin{abstract} + \input{abstract.tex} +\end{abstract} + +\input{contents.tex} + +\printbibliography +\end{document} diff --git a/debug/slides/preamble.tex b/debug/slides/preamble.tex new file mode 100644 index 00000000..757ec069 --- /dev/null +++ b/debug/slides/preamble.tex @@ -0,0 +1,41 @@ +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[british]{babel} +\usepackage{booktabs} +\usepackage{noweb} +\usepackage{pdfpages} + +\usepackage[all]{foreign} +\renewcommand{\foreignfullfont}{} +\renewcommand{\foreignabbrfont}{} + +\usepackage{newclude} +\usepackage{import} + +\usepackage[strict]{csquotes} +\usepackage[single]{acro} + +\usepackage[natbib,style=alphabetic,maxbibnames=99]{biblatex} +\addbibresource{debug.bib} + +\usepackage{subcaption} + +\usepackage[noend]{algpseudocode} +\usepackage{xparse} + +\let\email\texttt + +\usepackage[outputdir=ltxobj]{minted} +\setminted{autogobble} + +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{mathtools} +\usepackage{amsthm} +\usepackage{thmtools} +\usepackage[unq]{unique} +\DeclareMathOperator{\powerset}{\mathcal{P}} + +\usepackage[binary-units]{siunitx} + +\usepackage[capitalize]{cleveref} diff --git a/debug/slides/slides.tex b/debug/slides/slides.tex new file mode 100644 index 00000000..8a86b03b --- /dev/null +++ b/debug/slides/slides.tex @@ -0,0 +1,118 @@ +\documentclass[ignoreframetext]{beamer} +\input{preamble.tex} + +\usetheme{Berlin} +\setbeamertemplate{footline}%{miniframes theme} +{% + \begin{beamercolorbox}[colsep=1.5pt]{upper separation line foot} + \end{beamercolorbox} + \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% + leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}% + \leavevmode{\usebeamerfont{author in head/foot}\insertshortauthor}% + \hfill% + {\usebeamerfont{institute in head/foot}\usebeamercolor[fg]{institute in head/foot}\insertshortinstitute}% + \end{beamercolorbox}% + \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% + leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}% + {\usebeamerfont{title in head/foot}\insertshorttitle} \hfill \insertframenumber% + \end{beamercolorbox}% + \begin{beamercolorbox}[colsep=1.5pt]{lower separation line foot} + \end{beamercolorbox} +} +\setbeamercovered{transparent} +\setbeamertemplate{bibliography item}[text] + +\AtBeginSection[]{% + \begin{frame} + \tableofcontents[currentsection] + \end{frame} +} + +\ProvideDocumentEnvironment{assumption}{o}{% + \IfValueTF{#1}{% + \begin{block}{Assumption: #1} + }{% + \begin{block}{Assumption} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{protocol}{o}{% + \IfValueTF{#1}{% + \begin{block}{Protocol: #1} + }{% + \begin{block}{Protocol} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{remark}{o}{% + \IfValueTF{#1}{% + \begin{alertblock}{Note: #1} + }{% + \begin{alertblock}{Note} + } +}{% + \end{alertblock} +} + +\ProvideDocumentEnvironment{idea}{o}{% + \IfValueTF{#1}{% + \begin{block}{Idea: #1} + }{% + \begin{block}{Idea} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{question}{o}{% + \setbeamercolor{block body}{bg=orange!15,fg=black} + \setbeamercolor{block title}{bg=orange,fg=white} + \setbeamercolor{local structure}{fg=orange} + \IfValueTF{#1}{% + \begin{block}{Question: #1} + }{% + \begin{block}{Question} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{exercise}{o}{% + \setbeamercolor{block body}{bg=yellow!10,fg=black} + \setbeamercolor{block title}{bg=yellow,fg=black} + \setbeamercolor{local structure}{fg=yellow} + \IfValueTF{#1}{% + \begin{block}{Exercise: #1} + }{% + \begin{block}{Exercise} + } +}{% + \end{block} +} + + +\begin{document} +\title{% + Debugging +} +\author{Daniel Bosk} +\institute{% + KTH EECS +} + +\begin{frame} + \maketitle +\end{frame} + +\mode +\input{contents.tex} +\mode* + +\begin{frame}[allowframebreaks] + \printbibliography +\end{frame} +\end{document}