%
% Header-Informationen
%
\documentclass{beamer}

\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}

% benutze CodeListe
\usepackage{xcolor}
\usepackage{listings}
\lstset{basicstyle=\small, numberstyle=\tiny, extendedchars=true, numbers=left,numbersep=5pt, frame=single}
\lstset{backgroundcolor=\color{white!75!lightgray}}
\lstset{keywordstyle=\color{blue!50!gray},  identifierstyle=\color{black}}
\lstset{commentstyle=\color{green!50!gray}, stringstyle=\color{red!50!gray}}
\lstset{language=C, fontadjust=true}

% Inkludiere Creative Commons helper
\input{cc_beamer}

% für mathematische Umgebungen
\usepackage{amsmath,amsfonts,amssymb}

% generelles tThema auswählen
\usetheme{Madrid}
% AnnArbor | Antibes | Bergen | Berkeley | Berlin | Boadilla | boxes | CambridgeUS | Copenhagen | Darmstadt | default | Dresden | Frankfurt | Goettingen | Hannover | Ilmenau | JuanLesPins | Luebeck | Madrid | Malmoe | Marburg | Montpellier | PaloAlto | Pittsburgh | Rochester | Singapore | Szeged | Warsaw

% Farben wählen
\usecolortheme{orchid}
% beaver | beetle | crane | default | dolphin | dove | fly | lily | orchid | rose | seagull | seahorse | sidebartab | structure | whale | wolverine

% Schriftart wählen
\usefonttheme{default}
% default | professionalfonts | serif | structurebold | structureitalicserif | structuresmallcapsserif

% Innere Themen(Kopf-, Fuß-, Sidebar usw)
\useinnertheme{default}
% default | inmargin | rectangles | rounded | circles

% Äußere Themen (Anordnung der inneren, grenzen der Folien etc.)
\useoutertheme{infolines}
% default | infolines | miniframes | shadow | sidebar | smoothbars | smoothtree | split | tree

% Deaktiviere Navigations-Symbole ({} -> leer)
\setbeamertemplate{navigation symbols}{}

% Zeige ein Hintergrundbild
\setbeamertemplate{background canvas}{\hspace*{2cm}\includegraphics[width=15cm]{Bilder/filled-no-url.pdf}}

% transparente Overlays?
%\setbeamercovered{transparent}

% Inhaltliches ausblenden schwächer
%\setbeamertemplate{section in head/foot shaded}[default][50]

%  Navigation am Rand?
%\beamertemplatenavigationsymbolsempty

% Foliennummer einfügen
\setbeamertemplate{footline}[frame number]

%
% Eigene Kommandos
%

% RICHIG GROßER FONT!
\newfont{\bigfont}{cmr10 at 144pt}

%
% Meta-Informationen
%

% Vortragstitel
\title{Debugging}

% Untertitel
\subtitle{C - Kurs 2009}

% Author
\author[A. Eichner]{Alexander Eichner}

% Institut
\institute[FR -- TU Berlin]{ \url{www.freitagsrunde.org} }

% Datum
\date{\today}

% Logo auf jeder Folie einfügen (Tux?)
%\logo{\includegraphics[width=2cm,height=2cm]{Bilder/Tux}}

% Logo auf TitelSeite wie be logo
%\titlegraphic{\includegraphics[width=1.5cm]{Bilder/filled-no-url}}

% Thema als PDF-Eigenschaft                            
\subject{C-Kurs 2009 - Debugging}

% Schlüsselwörter
\keywords{Fachschaft, Studenteninitiative, Berlin, TU, Freitagsrunde, CKurs, assert, gdb, valgrind, debugging, bugs}

% Templates

% Grafikpage
%\begin{frame}{Einführungswoche}
%  \centering
%  \includegraphics[height=0.82\textheight]{Bilder/EWoche} \\
%\end{frame}

% Zweigeteilt
%\begin{frame}{Studentische Kurse}
%  \centering
%  \begin{tabular}[rw]{c|c}
%    \hspace*{1cm}{\bigfont C}\hspace*{0.5cm} & % CKurs
%    \hspace*{1cm}\includegraphics[height=0.5\textheight]{Bilder/Java}
%  \end{tabular}
%\end{frame}

%
% Start des eigentlichen Inhalts
%

\begin{document}

% Titelseite
\begin{frame}
  \titlepage
  \vfill
  \begin{center}
    \CcGroupByNcSa{0.83}{0.95ex}\\[2.5ex]
    {\tiny\CcNote{\CcLongnameByNcSa}}
    \vspace*{-2.5ex}
  \end{center}                                                                        
\end{frame}

% Inhaltsfolie (ohne Betonung auf aktuellen Bereich)
\begin{frame}{Inhaltsverzeichniss}
  \tableofcontents
\end{frame}

% Begin der Einführung
\section[wdh] {Wiederholung}

% zeigt an wo wir gerade sind
\begin{frame}[label=Inhalt]{Inhaltsverzeichniss}
  \tableofcontents[currentsection]
\end{frame}

% Begin des Vortrages
\begin{frame}{Was habt ihr gelernt}
  \begin{itemize}
    \item (Fast) Alles was man zum Schreiben eines Programms in C wissen muss
    \pause
     - theoretisch
    \pause
    \item Es fehlt Übung und Erfahrung, um gewisse Fehler zu vermeiden
  \end{itemize}
\end{frame}

\begin{frame}{Ziele dieser Vorlesung}
  \begin{itemize}
    \item Die Fallstricke von C kennenlernen
    \item Möglichkeiten des Debugging kennenlernen
    \item Bugs identifzieren
    \item einen Debugger effektiv einsetzen zu können
    \item euch das Leben einfacher zu machen ;)
  \end{itemize}
\end{frame}%{Debugging}

% Hauptteil
\section[theo]{Ein wenig Theorie}
\againframe{Inhalt}

\begin{frame}[fragile]
  \frametitle{Wie äußern sich Fehler im Programm?}
  \begin{itemize}
    \item Programm compiliert gar nicht erst
    \pause
    \item Es stürzt ab (SIGSEGV oder SIGBUS)
    \pause
    \item Es reagiert nicht mehr stürzt aber nicht ab
    \pause
    \item Es macht nicht das was es soll
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Arten von Bugs}
  Heap/Stack Overflow
  \pause
  - Programm stürzt ab
  \begin{itemize}
    \item bedeutet das das Programm auf nicht reservierten Speicher zugreift
  \end{itemize}
    \begin{exampleblock}{Beispiel}
    \begin{lstlisting}
char *pStr = 0xdeadbeef;
printf("%s\n", pStr);
    \end{lstlisting}
    \hrule \vspace{0.125cm}
    Ausgabe: \\
    \begin{lstlisting}
Segmentation fault (core dumped)
    \end{lstlisting}
    \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Arten von Bugs}
  Integeroverflow
    \begin{exampleblock}{Beispiel}
    \begin{lstlisting}
unsigned char byte = 255;
printf("byte = %d\n", byte);
byte++;
printf("byte = %d\n", byte);
printf("%d\n", 10/byte);
    \end{lstlisting}
    \hrule \vspace{0.125cm}
    Ausgabe: \\
    \begin{lstlisting}
byte = 255
byte = 0
Floating point exception (core dumped)
    \end{lstlisting}
    \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Arten von Bugs}
  Unitialisierte Variablen
    \begin{exampleblock}{Beispiel}
    \begin{lstlisting}
int iWert;
printf("wert = %d\n", iWert);
    \end{lstlisting}
    \hrule \vspace{0.125cm}
    Ausgabe: \\
    \begin{lstlisting}
wert = undefiniert
    \end{lstlisting}
    \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Arten von Bugs}
  \begin{itemize}
    \item Endlosschleifen
    \pause
    \item Speicherkorruption
    \pause - oft schwierig zu debuggen
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Hitliste der beliebtesten Stolpersteine in C}
  Platz 1: = anstatt ==
  \pause
  \begin{exampleblock}{Beispiel}
    \begin{lstlisting}
    int iWert = 2;
    if (iWert = 3)
        printf("iWert ist 3\n");
    \end{lstlisting}
    \hrule \vspace{0.125cm}
    Ausgabe: \\
    \begin{lstlisting}
       iWert ist 3
    \end{lstlisting}
  \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Hitliste der beliebtesten Stolpersteine in C}
  Platz 2: ; an der falschen Stelle
  \pause
  \begin{exampleblock}{Beispiel}
    \begin{lstlisting}
int iWert = 2;
if (iWert == 3);
    printf("iWert ist 3\n");
    \end{lstlisting}
    \hrule \vspace{0.125cm}
    Ausgabe: \\
    \begin{lstlisting}
iWert ist 3
    \end{lstlisting}
  \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Hitliste der beliebtesten Stolpersteine in C}
  \begin{exampleblock}{Beispiel: Endlosschleife}
    \begin{lstlisting}
int iCountdown = 10;

while (iCountdown > 0);
{
    printf("%d\n", iCountdown);
    iCountdown--;
}
    \end{lstlisting}
    \pause
    \hrule \vspace{0.125cm}
    Ausgabe: \\
  \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Hitliste der beliebtesten Stolpersteine in C}
  Platz 3: case ohne break in switch
  \pause
  \begin{exampleblock}{Beispiel}
    \begin{lstlisting}
    int iValue = 2;

    switch (iValue)
    {
        case 1: printf("iValue = 1\n");
        case 2: printf("iValue = 2\n");
        case 3: printf("iValue = 3\n");
        default:
            printf("iValue = %d\n", iValue);
    }
    \end{lstlisting}
    \hrule \vspace{0.125cm}
    \pause
    Ausgabe: \\
    \begin{lstlisting}
       iValue = 2
       iValue = 3
       iValue = 2
    \end{lstlisting}
  \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Hitliste der beliebtesten Stolpersteine in C}
  Platz 4: Dangling else
  \pause
  \begin{exampleblock}{Beispiel: Wo gehört das else hin?}
    \begin{lstlisting}
int iValue = 2;
int iVal2  = 1;

if (iValue == 1)
    if (iVal2 == 1)
        printf("Both 1\n");
else
    printf("iValue=%d\n", iValue);
    \end{lstlisting}
    \hrule \vspace{0.125cm}
    \pause
    Ausgabe: \\
  \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Hitliste der beliebtesten Stolpersteine in C}
    reicht fürs Erste\\
    http://literateprogramming.com/ctraps.pdf
\end{frame}

\begin{frame}{Und wie debugge ich jetzt?}
  \begin{itemize}
    \item Instrumentalisierung
    \item Assertions
    \item gdb
  \end{itemize}
\end{frame}


\begin{frame}[fragile]
  \frametitle{Arten des Debugging}
  Instrumentalisierung
  \pause
  \begin{exampleblock}{Beispiel: printf}
    \begin{lstlisting}
int iValue = 2

printf("iValue is %d now\n", iValue);
if (iValue == 2) {
    printf("Branch 1 taken\n");
    ...
} else {
    printf("Branch 2 taken\n");
    ...
}
    \end{lstlisting}
    \hrule \vspace{0.125cm}
    Ausgabe: \\
    \begin{lstlisting}
iValue is 2 now
Branch 1 taken
    \end{lstlisting}
  \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Arten des Debugging - Assertions}
  Assertions\\
  \begin{exampleblock}{Beispiel: assert}
    \begin{lstlisting}
#include <assert.h>

int strlen(const char *pszStr)
{
    assert(pszStr != NULL);
    ...
}
    \end{lstlisting}
  \end{exampleblock}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Arten des Debugging - Assertions}
  \begin{itemize}
    \item fängt unerlaubte Zustände im Programm sehr früh ab
    \item -DNDEBUG deaktiviert sie im Releasecode
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Arten des Debugging - gdb}
  Was kann man mit dem gdb machen?
  \begin{itemize}
    \item erlaubt es Programme zur Laufzeit anzuhalten
    \item Zustand des Programmes kann untersucht und verändert werden
    \item noch viel mehr
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Arten des Debugging - gdb}
  Vorbereitung\\
  \pause
  Die richtigen Compilerflags: gcc -g -O0 -o prog prog.c
\end{frame}

% Hauptteil
\section[praxis]{Praxis}
\againframe{Inhalt}

% Fragen
\begin{frame}{Danke}
  Fragen?
\end{frame}

% Leere Seite
\begin{frame}{}
\end{frame}

\end{document}
% Ende
