diff --git a/shared/imgs/call_stack.png b/shared/imgs/call_stack.png new file mode 120000 index 0000000..1b89081 --- /dev/null +++ b/shared/imgs/call_stack.png @@ -0,0 +1 @@ +../../report/imgs/call_stack/call_stack.png \ No newline at end of file diff --git a/shared/todo.sty b/shared/todo.sty index 86ae375..05076cb 100644 --- a/shared/todo.sty +++ b/shared/todo.sty @@ -8,4 +8,4 @@ \newcommand{\qtodo}[1]{\colorbox{todobg}{\textcolor{todofg}{#1}}} \newcommand{\todo}[1]{\qtodo{\textbf{TODO:}\,#1}} \newcommand{\qnote}[1]{\colorbox{notebg}{\textcolor{notefg}{#1}}} -\newcommand{\note}[1]{\qnote{\textbf{NOTE:}\,#1}} +\newcommand{\tnote}[1]{\qnote{\textbf{NOTE:}\,#1}} diff --git a/slides/img/dwarf_logo.png b/slides/img/dwarf_logo.png new file mode 100644 index 0000000..88e10fd Binary files /dev/null and b/slides/img/dwarf_logo.png differ diff --git a/slides/slides.tex b/slides/slides.tex index 7cd9893..dcfd8dd 100644 --- a/slides/slides.tex +++ b/slides/slides.tex @@ -8,7 +8,13 @@ \usepackage{amsmath} \usepackage{amsfonts} \usepackage{amssymb} -\usepackage{my_listings} + +\usepackage{../shared/my_listings} +%\usepackage{../shared/my_hyperref} +\usepackage{../shared/specific} +\usepackage{../shared/common} +\usepackage{../shared/todo} + \setbeamertemplate{navigation symbols}{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -38,4 +44,123 @@ \tableofcontents \end{frame} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Stack unwinding data} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{Introduction} + +\begin{frame}[fragile]{We often use stack unwinding!} + \begin{lstlisting}[language=, numbers=none, escapechar=|] +Program received signal SIGSEGV, Segmentation fault. +0x0000555555554625 in fct_b (m=0x5c) at segfault.c:5 +5 printf("%l\n", *m); +|\pause| +(gdb) backtrace +#0 0x0000555555554625 in fct_b (m=0x5c) at segfault.c:5 +#1 0x0000555555554663 in fct_a (n=42) at segfault.c:10 +#2 0x0000555555554674 in main () at segfault.c:14 +|\pause| +(gdb) frame 1 +#1 0x0000555555554663 in fct_a (n=42) at segfault.c:10 +10 fct_b((int*)(some_fct_a_var + 8)); +|\pause| +(gdb) print some_fct_a_var +$1 = 84 + \end{lstlisting} + + \pause{} + \begin{center} + \textbf{\Large How does it work?!} + \end{center} + \vspace{1em} +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{Stack frames and unwinding} + +\begin{frame}{Call stack and registers} + \begin{columns}[c] + \begin{column}{0.65\textwidth} + \begin{itemize} + \item Programs use a \alert{call stack} + \item Organized in \alert{stack frames} + \begin{itemize} + \item Local variables + \item Function parameters + \item Keep track of nesting, registers and ``return + point'' + \end{itemize} + \end{itemize} + + Common registers: + \begin{itemize} + \item \reg{rip}: program counter (PC) + + \item \reg{rsp}: stack pointer + + \item \reg{rbp}: base pointer + \begin{itemize} + \item Saves \reg{rsp} + \item Easy access + \item Wastes a register + \item Not often used (x86\_64) + \end{itemize} + \end{itemize} + \end{column} + \begin{column}{0.35\textwidth} + \includegraphics[width=0.95\linewidth]{../shared/imgs/call_stack} + \end{column} + \end{columns} +\end{frame} + +\begin{frame}{Isn't it as trivial as \texttt{pop()}?} + \begin{itemize} + \item This is only a \alert{blob of binary data} without mandatory + structure + \item We ignore \alert{which registers were saved} + \item We ignore \alert{whether \reg{rbp} was used} + \item We ignore \alert{where the return address is stored} + \item We ignore \alert{where the previous frame begins} + \end{itemize} + + \medskip + + But\ldots{} if we know how to \alert{unwind one}, we can \alert{recurse}! +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{DWARF tables} + +\begin{frame}[fragile]{DWARF unwinding data} + + \begin{lstlisting}[numbers=none, language=] +00009b30 48 009b34 FDE cie=0000 pc=0084950..0084b37 + LOC CFA rbx rbp r12 r13 r14 r15 ra +0084950 rsp+8 u u u u u u c-8 +0084952 rsp+16 u u u u u c-16 c-8 +0084954 rsp+24 u u u u c-24 c-16 c-8 +0084956 rsp+32 u u u c-32 c-24 c-16 c-8 +0084958 rsp+40 u u c-40 c-32 c-24 c-16 c-8 +0084959 rsp+48 u c-48 c-40 c-32 c-24 c-16 c-8 +008495a rsp+56 c-56 c-48 c-40 c-32 c-24 c-16 c-8 +0084962 rsp+64 c-56 c-48 c-40 c-32 c-24 c-16 c-8 +0084a19 rsp+56 c-56 c-48 c-40 c-32 c-24 c-16 c-8 +0084a1d rsp+48 c-56 c-48 c-40 c-32 c-24 c-16 c-8 +0084a1e rsp+40 c-56 c-48 c-40 c-32 c-24 c-16 c-8 +0084a20 rsp+32 c-56 c-48 c-40 c-32 c-24 c-16 c-8 +0084a22 rsp+24 c-56 c-48 c-40 c-32 c-24 c-16 c-8 +0084a24 rsp+16 c-56 c-48 c-40 c-32 c-24 c-16 c-8 +0084a26 rsp+8 c-56 c-48 c-40 c-32 c-24 c-16 c-8 +0084a30 rsp+64 c-56 c-48 c-40 c-32 c-24 c-16 c-8 + \end{lstlisting} + + \pause{} + + \vspace{-4cm} + \hfill\includegraphics[height=3cm, angle=45, origin=c]{img/dwarf_logo} + \hspace{-1cm} + +\end{frame} + \end{document}