412 lines
8.7 KiB
TeX
412 lines
8.7 KiB
TeX
% Created 2019-06-02 Sun 21:20
|
|
% 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}
|
|
\usepackage{listings}
|
|
\lstdefinestyle{customc}{belowcaptionskip=1\baselineskip,breaklines=true,frame=L,xleftmargin=\parindent,language=C,showstringspaces=false,basicstyle=\footnotesize\ttfamily,keywordstyle=\bfseries\color{green!40!black},commentstyle=\itshape\color{purple!40!black},identifierstyle=\color{blue},stringstyle=\color{orange},}
|
|
\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:orga1f4768}]{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}[label={sec:org13db7cc}]{Agenda}
|
|
\begin{itemize}
|
|
\item Blabla
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile,label={sec:orgcb90a6c}]{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:orgb03390f}]{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:org71ced54}]{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:org361654c}]{\{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:org62a7e28}]{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:org717537c}]{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:org71b8f2a}]{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:org1b45b5a}]{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:org22c386a}]{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:org7b2681d}]{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:org73ead26}]{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:orgf6ce0ab}]{Other advanced features}
|
|
\begin{itemize}
|
|
\item Python support.
|
|
|
|
\item Reverse debugging.
|
|
|
|
\item Support for \emph{SystemTap SDT probes}.
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile,label={sec:org0d39b0e}]{End}
|
|
\lstset{language=C,label= ,caption= ,captionpos=b,firstnumber=1,numbers=left,style=customc}
|
|
\begin{lstlisting}
|
|
int main ()
|
|
{
|
|
const char *c = NULL;
|
|
|
|
return 0;
|
|
}
|
|
\end{lstlisting}
|
|
\end{frame}
|
|
\end{document}
|