% Created 2019-06-03 Mon 10:40
% Intended LaTeX compiler: pdflatex
\documentclass[presentation]{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{grffile}
\usepackage{longtable}
\usepackage{wrapfig}
\usepackage{rotating}
\usepackage[normalem]{ulem}
\usepackage{amsmath}
\usepackage{textcomp}
\usepackage{amssymb}
\usepackage{capt-of}
\usepackage{hyperref}
\usepackage{color}
\usepackage{listings}
\usetheme{default}
\author{Sergio Durigan Junior \\ sergiodj@\{sergiodj.net,redhat.com,debian.org\}}
\date{}
\title{GDB Intro}
\hypersetup{
 pdfauthor={Sergio Durigan Junior \\ sergiodj@\{sergiodj.net,redhat.com,debian.org\}},
 pdftitle={GDB Intro},
 pdfkeywords={},
 pdfsubject={},
 pdfcreator={Emacs 26.1 (Org mode 9.1.9)}, 
 pdflang={English}}
\begin{document}

\maketitle

\begin{frame}[label={sec:orgeac0a69}]{License}
\begin{itemize}
\item License: \alert{Creative Commons Attribution 4.0 International License (CC-BY-4.0)}

\item \url{https://creativecommons.org/licenses/by/4.0/}
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:org071d481}]{Introduction}
 \begin{itemize}
\item \texttt{GDB}: \texttt{GNU} project's Debugger \pause (it is \alert{not} a
\emph{database}\ldots{}).  Supports several programming languages.

\item Started around 1986 by Richard Stallman (after \alert{GNU Emacs}, but
likely before \alert{GCC}).
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:org2d0fe11}]{Compiling your program for GDB}
 \begin{itemize}
\item Your program needs to contain \alert{debug information} (also called
\texttt{DWARF}) for GDB to consume.
\end{itemize}

\pause

\begin{itemize}
\item The GCC flag to include debug information is \texttt{-g}.  We also use
\texttt{-g3}, which includes information about macros (\texttt{\#define}).
\end{itemize}

\pause

\begin{itemize}
\item It's common to \alert{disable optimizations} when building the binary, by
using the flag \texttt{-O0} (it's \emph{dash-oh-zero}).

\pause

\begin{itemize}
\item \texttt{\# gcc -O0 -g program.c -o program}, \emph{or}

\item \texttt{\# CFLAGS='-O0 -g' ./configure \&\& make}
\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:org8bba82f}]{Running your program using GDB}
 \begin{itemize}
\item In GDB's parlance, the program being debugged is called the
\alert{inferior}.
\end{itemize}

\pause

\begin{itemize}
\item Some ways to start the debugger:

\pause

\begin{itemize}
\item \texttt{\# gdb ./program}
\end{itemize}

\pause

\begin{itemize}
\item \texttt{\# gdb -{}-args ./program arg1 arg2}
\end{itemize}

\pause

\begin{itemize}
\item \texttt{\# gdb}  \\
\texttt{(gdb) file ./program}  \\
\texttt{(gdb) run arg1 arg2}
\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:org5c690dd}]{\{Break,Catch,Watch\}points}
 \begin{itemize}
\item A \alert{breakpoint} is related to \emph{source code} (location, function).  A
\alert{watchpoint} is related to \emph{data} (read/write of a variable).  A
\alert{catchpoint} is related to an \emph{event} (enter/exit a syscall, fork,
receive a signal).
\end{itemize}

\pause

\begin{itemize}
\item Breakpoints (\emph{code})

\begin{itemize}
\item \texttt{break}

\item \texttt{tbreak} (temporary)
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item Watchpoints (\emph{data})

\begin{itemize}
\item \texttt{watch} (write), \texttt{rwatch} (read), \texttt{awatch} (access)

\item Conditional watchpoints are supported.
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item Catchpoints (\emph{events})

\begin{itemize}
\item \texttt{catch fork}

\item \texttt{catch syscall}
\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:orgfc53d4a}]{Resuming the execution}
 \begin{itemize}
\item After GDB has stopped the inferior (because a \texttt{*point} has been hit,
for example), you will probably want to resume its execution.
\end{itemize}

\pause

\begin{itemize}
\item You may just want to continue the program:

\begin{itemize}
\item \texttt{continue}
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item Or maybe go to the next statement/instruction:

\begin{itemize}
\item \texttt{next} (\emph{statement}), or \texttt{nexti} (\emph{instruction})
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item Or step into a function:

\begin{itemize}
\item \texttt{step} (\emph{statement}), or \texttt{stepi} (\emph{instruction})
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item Or finish executing the current function, but stop at the end:

\begin{itemize}
\item \texttt{finish}
\end{itemize}
\end{itemize}
\end{frame}



\begin{frame}[fragile,label={sec:org9dcb344}]{Examining data}
 \begin{itemize}
\item The inferior has stopped\ldots{}  Now what?
\end{itemize}

\pause

\begin{itemize}
\item You may want to print the value of some variable:

\begin{itemize}
\item \texttt{print VAR}
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item Or examine a memory location:

\begin{itemize}
\item \texttt{x ADDRESS}
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item The type of a variable?  Easy:

\begin{itemize}
\item \texttt{whatis VARIABLE}
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item Hint: you may want to enable pretty-printing:

\begin{itemize}
\item \texttt{set print pretty on}
\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:orga54b38a}]{Examining the code}
 \begin{itemize}
\item Yes, we have \texttt{ncurses}!  The \textbf{T}ext
\textbf{U}user \textbf{I}nterface!

\begin{itemize}
\item \texttt{C-x a} (that's \texttt{CTRL x a}).
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item If you want to list the current region, or if you don't want/can't
to use TUI:

\begin{itemize}
\item \texttt{list}
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item You can also disassemble code:

\begin{itemize}
\item \texttt{disassemble}
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item If GDB can't find the source code, you can specify its location
using the \texttt{dir} command.
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:orgab39cfc}]{Examining the call stack}
 \begin{itemize}
\item If you want to see the call stack (A.K.A. stack trace) that lead to
the current function:

\begin{itemize}
\item \texttt{bt}
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item And you can move through it:

\begin{itemize}
\item \texttt{up} and \texttt{down}

\item You can also go to a specific frame: \texttt{frame NUMBER}
\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:org66fa673}]{Corefiles}
 \begin{itemize}
\item \alert{Corefiles} are frozen images of the inferior.  You can inspect
everything that was happening when the process was running (but you
can't resurrect it).
\end{itemize}

\pause

\begin{itemize}
\item You can generate them \emph{outside} GDB, when a program crashes.  Make
sure you:

\begin{itemize}
\item \texttt{ulimit -c unlimited}

\item Check if \texttt{systemd} is handling them
(\texttt{/proc/sys/kernel/core\_pattern}).
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item You can also generate them \emph{inside} GDB, at any moment:

\begin{itemize}
\item \texttt{generate-core-file}
\end{itemize}
\end{itemize}

\pause

\begin{itemize}
\item You can open a corefile using GDB:

\begin{itemize}
\item \texttt{\# gdb program -c corefile.PID}
\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:orgb366da5}]{Other interesting information}
 \begin{itemize}
\item \texttt{info breakpoints}

\item \texttt{info locals}

\item \texttt{info registers}

\item Many others!
\end{itemize}
\end{frame}

\begin{frame}[fragile,label={sec:org6c7407d}]{Who you gonna call?}
 \begin{itemize}
\item Our online documentation (\texttt{info}) is very good!

\item Every command has a \texttt{help}.

\item You can also use \texttt{apropos} when searching for a term.

\item \texttt{TAB}-completion is also useful.
\end{itemize}
\end{frame}

\begin{frame}[label={sec:org9103f37}]{Other advanced features}
\begin{itemize}
\item Python support.

\item Reverse debugging.

\item Support for \emph{SystemTap SDT probes}.
\end{itemize}
\end{frame}

\begin{frame}[label={sec:org462e66a}]{Thank you}
\begin{itemize}
\item Thanks to Red Hat for the support.

\item Thanks to Paul Nijjar and Bob Jonkman for the invitation.

\item Thanks to you for watching!
\end{itemize}
\end{frame}
\end{document}
