summaryrefslogtreecommitdiff
path: root/application-devel
diff options
context:
space:
mode:
authorManuel Traut <manut@linutronix.de>2015-01-12 09:18:43 +0100
committerManuel Traut <manut@linutronix.de>2015-01-12 09:22:40 +0100
commit394d75a7e8ccda26386d41cbfeb82b4d320ac798 (patch)
tree5fd659839f7f085a01d283360f8da9e9d006e161 /application-devel
parent81d754d487ddf72418e03c2bb27f06e1e6355d46 (diff)
add jans ese 2012 slides as debugging tools
Signed-off-by: Manuel Traut <manut@linutronix.de>
Diffstat (limited to 'application-devel')
-rw-r--r--application-devel/Kconfig1
-rw-r--r--application-devel/debugging-tools/Kconfig7
-rw-r--r--application-devel/debugging-tools/Makefile1
-rw-r--r--application-devel/debugging-tools/pres_debugging-tools_de.tex1261
4 files changed, 1270 insertions, 0 deletions
diff --git a/application-devel/Kconfig b/application-devel/Kconfig
index 5a3f4d2..fcf633d 100644
--- a/application-devel/Kconfig
+++ b/application-devel/Kconfig
@@ -6,6 +6,7 @@ if APPLICATION_DEVELOPMENT
source "application-devel/devel-best-practices/Kconfig"
source "application-devel/debian-packages/Kconfig"
source "application-devel/app-debugging/Kconfig"
+ source "application-devel/debugging-tools/Kconfig"
source "application-devel/embedded-devel/Kconfig"
source "application-devel/posix-ipc/Kconfig"
source "application-devel/devel-environment/Kconfig"
diff --git a/application-devel/debugging-tools/Kconfig b/application-devel/debugging-tools/Kconfig
new file mode 100644
index 0000000..a1414b7
--- /dev/null
+++ b/application-devel/debugging-tools/Kconfig
@@ -0,0 +1,7 @@
+config DEBUGGING_TOOLS
+ bool "Application Debugging tools (german)"
+ default y
+ help
+ gdb, efence, duma, openocd, ldd
+
+
diff --git a/application-devel/debugging-tools/Makefile b/application-devel/debugging-tools/Makefile
new file mode 100644
index 0000000..e81121d
--- /dev/null
+++ b/application-devel/debugging-tools/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_DEBUGGING_TOOLS) += pres_debugging_tools_de.pdf
diff --git a/application-devel/debugging-tools/pres_debugging-tools_de.tex b/application-devel/debugging-tools/pres_debugging-tools_de.tex
new file mode 100644
index 0000000..8e5feac
--- /dev/null
+++ b/application-devel/debugging-tools/pres_debugging-tools_de.tex
@@ -0,0 +1,1261 @@
+\input{configpres}
+
+\subsection{Debugging}
+
+\title{\lq Debugging\rq}
+\maketitle
+
+\section{Die GNU Compiler Collection}
+\subsection{Hello world}
+\begin{frame}[fragile]
+\frametitle{Der GNU Compiler}
+\begin{lstlisting}[language=c]
+/* hello.c */
+#include <stdio.h>
+
+int main(void)
+{
+ printf("Hello world\n");
+ return 0;
+}
+\end{lstlisting}
+\begin{lstlisting}[language=bash]
+# Uebersetzen des Testprogramms
+gcc -o hello hello.c
+\end{lstlisting}
+\end{frame}
+
+\subsubsection{Wichtige Optionen}
+\begin{frame}[fragile]
+\frametitle{Wichtige gcc Optionen}
+\begin{lstlisting}[language=bash]
+# Nur Objectfile erzeugen
+gcc -c -o hello.o hello.c
+
+# Uebersetzen mit Optimierungslevel 3
+gcc -O3 -o hello hello.c
+
+# Ohne Optimierung und mit
+# Debugsymbolen uebersetzen
+gcc -O0 -g hello hello.c
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Wichtige gcc Optionen}
+\begin{lstlisting}[language=bash]
+# Gegen zusaetzliche Bibliothek linken (librt.so)
+gcc -lrt -o hello hello.c
+
+# Suchpfad fuer Bibliotheken hinzufuegen
+gcc -L /mypath -lrt -o hello hello.c
+
+# Suchpfad fuer Includes hinzufuegen
+gcc -I /mypath -o hello hello.c
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Wichtige gcc Optionen}
+\begin{lstlisting}[language=bash]
+# Alle Warnings ausgeben
+gcc -Wall -o hello hello.c
+
+# Warnings als Fehler behandeln
+gcc -Wall -Werror -o hello hello.c
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{GCC: Nützliches}
+\begin{lstlisting}[language=bash]
+# Vordefinierte / Interne Makros ausgeben
+$ gcc -E -dM - < /dev/null | cut -c 9- | sort
+[...]
+__SIZEOF_DOUBLE__ 8
+__SIZEOF_FLOAT__ 4
+__SIZEOF_INT__ 4
+__SIZEOF_LONG__ 8
+[...]
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{GCC: Nützliches}
+\begin{lstlisting}[language=bash]
+# Nur Pre-Prozessor ausfuehren
+$ gcc -C -E hello.c -o hello_pre
+
+# Woher kommt welches Symbol?
+$ gcc -Wl,-y,printf hello.c
+/lib/libc.so.6: definition of printf
+\end{lstlisting}
+Quelle und weitere nuetzliche Tipps: http://elinux.org/GCC\_Tips
+\end{frame}
+
+\subsection{Der Dynamic Loader}
+\begin{frame}
+\frametitle{Der Dynamic Loader: ld-linux.so}
+\begin{alertblock}{Was ist der Dynamic Loader?}
+Der Dynamic Loader: ld-linux.so lädt die dynamischen Bibliotheken, die von einem Programm
+benötigt werden. Er ist Bestandteil der C Bibliothek.
+\end{alertblock}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Der Dynamic Loader: ld-linux.so}
+\begin{lstlisting}[language=bash]
+# Entweder
+./hello
+
+# oder
+/lib/ld-linux-x86-64.so.2 ./hello
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Der Dynamic Loader: Umgebungsvariablen}
+\begin{tabular}{|l|p{5cm}|}
+\hline
+\textbf{Umgebungsvariable} & \textbf{Abkürzung} \\
+\hline
+LD\_LIBRARY\_PATH & Suchpfad für Bibliotheken \\
+\hline
+LD\_PRELOAD & Liste von Bibliotheken, die vor allen anderen zu laden sind \\
+\hline
+LD\_DEBUG & Debug Ausgaben \\
+\hline
+\end{tabular}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Der Dynamic Loader: Umgebungsvariablen}
+\begin{lstlisting}[basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ LD_DEBUG=help ./hello
+Valid options for the LD_DEBUG environment
+variable are:
+
+ libs display library search paths
+ reloc display relocation processing
+ files display progress for input file
+ symbols display symbol table processing
+ bindings display information about symbol binding
+ versions display version dependencies
+ all all previous options combined
+ statistics display relocation statistics
+ unused determined unused DSOs
+ help display this help message and exit
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}
+\frametitle{Der Dynamic Loader: Suchreihenfolge}
+\begin{enumerate}
+\item DT\_RPATH dynamic subsection (ELF)
+\item LD\_LIBRARY\_PATH
+\item DT\_RUNPATH dynamic subsection (ELF)
+\item ld.so.cache
+\item /lib bzw. /usr/lib
+\end{enumerate}
+\end{frame}
+
+\subsection{Die Binutils}
+\subsubsection{Übersicht}
+\begin{frame}
+\frametitle{Die Binutils}
+Eine Sammlung von Programmen zum Erstellen / Bearbeiten von Binaries.
+Die wichtigsten Tools sind:
+\begin{itemize}
+\item Der GNU Linker (ld)
+\item Der GNU Assembler (as)
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Weitere Programme der Binutils}
+\begin{itemize}
+\item \textbf{addr2line}: Ordnet Adressen Zeilennummern zu
+\item \textbf{gprof}: Profiler
+\item \textbf{nm}: Listet Symbole in Objectfiles
+\item \textbf{objcopy}: Kopiert und konvertiert Objectfiles
+\item \textbf{objdump}: Listet Informationen zu Objectfiles
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Weitere Programme der Binutils}
+\begin{itemize}
+\item \textbf{ranlib}: Generiert den Index zu einem Archivinhalt
+\item \textbf{readelf}: Zeigt Informationen zu ELF Files
+\item \textbf{size}: Listet die Sektionsgrößen für Object- oder ELF Files
+\item \textbf{strip}: Entfernt Symbole
+\end{itemize}
+\end{frame}
+
+\subsubsection{objdump}
+\begin{frame}[containsverbatim]
+\frametitle{Untersuchen von Binaries mit Objdump}
+\begin{lstlisting}[language=bash]
+jan@hopfropf:~$ objdump -x /bin/ls
+/bin/ls: file format elf64-x86-64
+/bin/ls
+architecture: i386:x86-64, flags 0x00000112:
+EXEC_P, HAS_SYMS, D_PAGED
+start address 0x0000000000402490
+
+Program Header:
+ PHDR off 0x0000000000000040 vaddr [...]
+ filesz 0x00000000000001f8 memsz [...]
+[...]
+Dynamic Section:
+ NEEDED librt.so.1
+[...]
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Untersuchen von Binaries mit Objdump}
+\begin{lstlisting}[language=bash]
+Version References:
+ required from librt.so.1:
+ 0x09691a75 0x00 07 GLIBC_2.2.5
+[...]
+Sections:
+Idx Name Size VMA [...]
+ 0 .interp 0000001c 000000000040 [...]
+ CONTENTS, ALLOC, LOAD, [...]
+ 1 .note.ABI-tag 00000020 000000000040 [...]
+ CONTENTS, ALLOC, LOAD, [...]
+[...]
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Bibliotheksabhängigkeiten mit objdump bestimmen}
+\begin{lstlisting}[language=bash]
+jan@hopfropf:~$ objdump -x /bin/ls | grep NEEDED
+ NEEDED librt.so.1
+ NEEDED libselinux.so.1
+ NEEDED libacl.so.1
+ NEEDED libc.so.6
+\end{lstlisting}
+\end{frame}
+
+\subsubsection{addr2line}
+\begin{frame}[containsverbatim]
+\frametitle{Adressen zuordnen mit addr2line}
+\begin{lstlisting}[language=bash]
+objdump -D hello | less
+\end{lstlisting}
+\begin{verbatim}
+[...]
+000000000040050c <main>:
+ 40050c: 55 push %rbp
+ 40050d: 48 89 e5 mov %rsp,%rbp
+[...]
+\end{verbatim}
+\begin{lstlisting}[language=bash]
+$ addr2line -e hello 40050c
+/home/jan/work/examples/hello.c:4
+\end{lstlisting}
+\end{frame}
+
+\section{Einfache Debugging Werkzeuge}
+\begin{frame}
+\frametitle{STRACE}
+\begin{alertblock}{Was ist STRACE?}
+STRACE ist ein mächtiges Diagnosewerkzeug, mit dem sich System Calls und Signale
+tracen lassen.
+\end{alertblock}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Anwendungsbeispiel}
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ strace /bin/ls
+execve("/bin/ls", ["/bin/ls"], [/* 38 vars */]) = 0
+brk(0) = 0x8061000
+access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT
+mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MA
+0xb7f03000
+access("/etc/ld.so.preload", R_OK) = -1 ENOENT
+open("/etc/ld.so.cache", O_RDONLY) = 3
+fstat64(3, {st_mode=S_IFREG|0644, st_size=113431, ...}
+[...]
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Wichtige STRACE Optionen}
+\begin{itemize}
+\item \textbf{-f}: Follow Forks
+\item \textbf{-v}: Verbose mode
+\item \textbf{-T}: Print out time which is spent in each syscall
+\item \textbf{-p PID}: Attach to PID
+\end{itemize}
+\end{frame}
+
+\section{Der GNU Debugger: GDB}
+\begin{frame}[containsverbatim]
+\frametitle{Hello world debuggen}
+\begin{enumerate}
+\item Übersetzen mit Debug Informationen
+\item Starten im Debugger:
+\begin{lstlisting}[language=bash]
+gdb ./hello
+\end{lstlisting}
+\end{enumerate}
+\end{frame}
+
+
+\begin{frame}[containsverbatim]
+\frametitle{Wichtige GDB Kommandos}
+\begin{verbatim}
+(gdb) run
+Starting program: /home/jan/work/examples/hello
+Hello world
+
+Program exited normally.
+(gdb)
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Wichtige GDB Kommandos}
+\begin{verbatim}
+(gdb) list
+1 #include <stdio.h>
+2
+3 int main (void)
+4 {
+5 printf("Hello world\n");
+6 return 0;
+7 }
+(gdb) break 5
+Breakpoint 1 at 0x400528: file hello.c, line 5.
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Wichtige GDB Kommandos}
+\begin{verbatim}
+(gdb) run
+Starting program: /home/jan/work/examples/hello
+
+Breakpoint 1, main () at hello.c:5
+5 printf("Hello world\n");
+(gdb) next
+Hello world
+6 return 0;
+(gdb) continue
+Continuing.
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{GDB Kommandos: Übersicht}
+\begin{tabular}{|c|c|p{5cm}|}
+\hline
+\textbf{Kommando} & \textbf{Abkürzung} & \textbf{Zweck} \\
+\hline
+run & r & Programm starten \\
+\hline
+continue & c & Programm fortsetzen \\
+\hline
+break X & b & Breakpoint in Zeile X setzen \\
+\hline
+step & s & step IN \\
+\hline
+next & n & step OVER \\
+\hline
+print var & -- & Inhalt von Variable var anzeigen \\
+\hline
+display var & -- & Inhalt von Variable var jedes mal anzeigen, wenn das Programm stoppt \\
+\hline
+\end{tabular}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{GDB Kommandos: Übersicht}
+\begin{tabular}{|c|c|p{5cm}|}
+\hline
+\textbf{Kommando} & \textbf{Abkürzung} & \textbf{Zweck} \\
+\hline
+backtrace & bt & Backtrace anzeigen \\
+\hline
+frame X & f & Im aktuellen Stack zu Frame Nr. X wechseln \\
+\hline
+quit & q & GDB beenden \\
+\hline
+\end{tabular}
+\end{frame}
+
+\section{Post mortem Debugging}
+\subsection{Core files}
+\begin{frame}[containsverbatim]
+\frametitle{Core Files}
+\begin{lstlisting}[language=C]
+/* arthur_dent.c */
+#include <stdio.h>
+
+int main (void)
+{
+char *arthur_dent = NULL;
+printf("Hello segfault world %s\n", *arthur_dent);
+return 0;
+}
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Core Files}
+\begin{lstlisting}[language=bash]
+$ ulimit -c unlimited
+$ ./hello_segfault
+Segmentation fault (core dumped)
+$ ls -l core*
+\end{lstlisting}
+\end{frame}
+
+\subsection{Core Files analysieren mit GDB}
+\begin{frame}[containsverbatim]
+\frametitle{Post Mortem Debugging mit GDB}
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ gdb hello_segfault core
+[...]
+Loaded symbols for /lib64/ld-linux-x86-64.so.2
+Core was generated by `./hello_segfault'.
+Program terminated with signal 11, Segmentation fault.
+#0 0x0000000000400538 in main () at hello_crash.c:6
+6 printf("Hello segfaulting world %s\n",
+ *arthur_dent);
+(gdb) bt
+#0 0x0000000000400538 in main () at hello_crash.c:6
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Wichtig Kommandos für Post Mortem Debugging}
+\begin{tabular}{|p{3.5cm}|p{5cm}|}
+\hline
+\textbf{Kommando} & \textbf{Zweck} \\
+\hline
+ulimit & Coredumps aktivieren und größe festlegen \\
+\hline
+cat /proc/sys/kernel/core\_pattern & Aktuelles Namenspattern für core-Files anzeigen \\
+\hline
+echo core-\%p \textgreater /proc/sys/kernel/core\_pattern & Namenspattern für
+core-Files setzen \\
+\hline
+gdb ./exe corefile & Coredump mit GDB anzeigen \\
+\hline
+\end{tabular}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Symboltabellen}
+Was tun, wenn Releases keine Debuginformation enthalten sollen?
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ gcc -g -Wall -Wextra -o arthur_dent arthur_dent.c
+$ objcopy --only-keep-debug arthur_dent arthur_dent.dbg
+$ strip --strip-all arthur_dent
+$ gdb arthur_dent core
+[...]
+Program terminated with signal 11, Segmentation fault.
+#0 0x0000000000400538 in ?? ()
+$ symbol-file arthur_dent.dbg
+[..]
+$ bt
+#0 0x0000000000400538 in main () at arthur_dent.c:6
+\end{lstlisting}
+\end{frame}
+
+\section{Cross Entwicklung}
+\subsection{Cross Übersetzen}
+\begin{frame}[containsverbatim]
+\frametitle{Cross ''Hello world''}
+\begin{lstlisting}[language=c]
+/* cross_hello.c */
+#include <stdio.h>
+
+int main(void)
+{
+ printf("Hello cross compiling world\n");
+ return 0;
+}
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Übersetzen für das Zielsystem}
+\begin{lstlisting}[language=bash]
+# Uebersetzen
+$ arm-none-linux-gnueabi-gcc -static \
+-o cross_hello cross_hello.c
+\end{lstlisting}
+\begin{lstlisting}[language=bash]
+# Executable ueberpruefen
+$ file cross_hello
+cross_hello: ELF 32-bit LSB executable, ARM,
+version 1 (SYSV), dynamically
+linked (uses shared libs),
+for GNU/Linux 2.6.14, not stripped
+\end{lstlisting}
+\end{frame}
+
+\subsection{Qemu als Testwerkzeug}
+\begin{frame}
+\frametitle{Qemu als Werkzeug zur Cross Entwicklung}
+\begin{alertblock}{Was ist Qemu?}
+Qemu ist eine sehr performante Emulations- und Virtualisierungsumgebung für alle
+gängigen CPU Architekturen.
+\end{alertblock}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Testen eines Executables mit der Qemu user emulation}
+\begin{lstlisting}[language=bash]
+$ ./cross_hello
+ : ./cross_hello: cannot execute binary file
+$ qemu-arm ./cross_hello
+Hello cross compiling world
+\end{lstlisting}
+\end{frame}
+
+\subsection{Rootfilesystem}
+\begin{frame}
+\frametitle{Komponenten des Zielsystems}
+\begin{overprint}
+\onslide <1>
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/target.png}
+\end{figure}
+\onslide <2>
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/target_highlight_rfs.png}
+\end{figure}
+\end{overprint}
+\end{frame}
+
+\begin{frame}
+\frametitle{Testsystem}
+\begin{figure}[h]
+\centering
+\includegraphics[width=9cm]{images/zielsystem.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Randdaten zum verwendeten RFS}
+\begin{itemize}
+\item Einfaches Busybox basiertes System
+\item FTP Server
+\item SSH Server (dropbear)
+\end{itemize}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Exportieren per NFS}
+\begin{lstlisting}
+# Auf Debian basierten Systemen (als root)
+sudo apt-get install nfs-kernel-server
+\end{lstlisting}
+\end{frame}
+\begin{frame}[containsverbatim]
+\frametitle{Exportieren per NFS}
+2) Directory exportieren
+\begin{lstlisting}[language=bash]
+sudo vim /etc/exports
+\end{lstlisting}
+\begin{verbatim}
+/tftpboot/nfsroot \
+192.168.2.0/255.255.255.0\
+(rw,no_root_squash,no_subtree_check,insecure)
+\end{verbatim}
+\begin{lstlisting}[language=bash]
+/etc/init.d/nfs-kernel-server restart
+\end{lstlisting}
+\end{frame}
+
+\section{Remote Debugging}
+\begin{frame}\frametitle{Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/remote_debug.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Anforderungen an das Zielsystem}
+\begin{itemize}
+\item libthread\_db.so.1
+\item libdl.so.2
+\item gdbserver
+\end{itemize}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Remote Debugging session}
+Auf dem Target:
+\begin{lstlisting}[language=bash]
+$ gdbserver :2345 ./cross_hello
+Process ./cross_hello created; pid = 310
+Listening on port 54321
+Remote debugging from host 192.168.2.1
+Hello world
+\end{lstlisting}
+Auf dem Host:
+\begin{lstlisting}[language=bash]
+$ arm-none-linux-gnu-gdb cross_hello
+(gdb) set solib-absolute-prefix /XXX/libc/
+(gdb) target remote 192.168.2.2:2345
+Remote debugging using 192.168.2.2:2345
+0x30016180 in _start() from /XXX/libc/lib/ld.so.1
+(gdb) c
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{gdbinit}
+GDB Kommandos automatisch ausführen:
+\begin{lstlisting}[language=bash]
+vim gdbinit.txt
+\end{lstlisting}
+\begin{verbatim}
+set solib-absolute-prefix /XXX/libc/
+target remote 192.168.2.2:2345
+\end{verbatim}
+\begin{lstlisting}[language=bash]
+arm-none-linux-gnu-gdb -x gdbinit.txt cross_hello
+\end{lstlisting}
+\end{frame}
+
+\section{Memory debugging}
+\begin{frame}
+\frametitle{Memory debugging}
+Gängige Probleme:
+\begin{itemize}
+\item Schreiben / Lesen über die Grenze von Speicherbereichen
+\item Memory leaks
+\item ''Use after free()''
+\end{itemize}
+\end{frame}
+\begin{frame}[containsverbatim]
+\frametitle{GLIBC eigene Mechanismen: MTrace}
+\begin{lstlisting}[language=C]
+/* mem_test.c */
+[...]
+#include <mcheck.h>
+[...]
+int main(void)
+{
+ mtrace();
+ [...]
+}
+\end{lstlisting}
+\begin{lstlisting}[language=bash]
+$ gcc -o mem_test mem_test.c
+$ MALLOC_TRACE=mytrace.log ./mem_test
+$ mtrace mem_test mytrace.log
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{GLIBC eigene Mechanismen: MTrace}
+\begin{lstlisting}[language=C,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+/* mem_leak.c */
+#include <mcheck.h>
+#include <malloc.h>
+#include <stdio.h>
+
+int main(void)
+{
+ int i = 0;
+ char *blurb = NULL;
+
+ mtrace();
+
+ for(i = 0; i < 50; i++)
+ blurb = malloc(sizeof(char));
+
+ free(blurb);
+}
+\end{lstlisting}
+\end{frame}
+\begin{frame}[containsverbatim]
+\frametitle{GLIBC eigene Mechanismen: MTrace}
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ gcc -g -o mem_leak mem_leak.c
+$ MALLOC_TRACE=mytrace.log ./mem_leak
+$ mtrace ./mem_leak mytrace.log
+
+Memory not freed:
+-----------------
+Address Size Caller
+0x1536460 0x1 at /home/jan/work/examples/mem_leak.c:13
+0x1536480 0x1 at /home/jan/work/examples/mem_leak.c:13
+0x15364a0 0x1 at /home/jan/work/examples/mem_leak.c:13
+[...]
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{libDUMA / electric fence}
+\begin{lstlisting}[language=C,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+/* mem_leak.c */
+#include <duma.h>
+#include <malloc.h>
+#include <stdio.h>
+
+int main(void)
+{
+ int i = 0;
+ char *blurb = NULL;
+
+ for(i = 0; i < 50; i++)
+ blurb = malloc(sizeof(char));
+
+ free(blurb);
+}
+\end{lstlisting}
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ gcc -g -o mem_leak mem_leak.c /usr/lib/libduma.a \
+ -lpthread
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{libDUMA / electric fence}
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ ./mem_leak
+DUMA 2.5.15 (static library)
+Copyright (C) 2006 Michael Eddington
+<meddington@gmail.com>
+Copyright (C) 2002-2008 Hayati Ayguen
+<h_ayguen@web.de>, Procitec GmbH
+Copyright (C) 1987-1999 Bruce Perens
+<bruce@perens.com>
+DUMA: ptr=0x7f7280bdbfff size=1 type='malloc()'
+ alloced from mem_leak.c(11) not freed
+DUMA: ptr=0x7f7280bddfff size=1 type='malloc()'
+ alloced from mem_leak.c(11) not freed
+[...]
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{libDUMA / electric fence: Überschriebener Speicher}
+\begin{lstlisting}[language=C,basicstyle=\ttfamily\fontsize{8}{8}\selectfont]
+/* array_access.c */
+#include <stdio.h>
+#include <malloc.h>
+#include <string.h>
+
+int main(void)
+{
+ int *my_array = (int*) malloc(10 * sizeof(int));
+ int i = 0;
+ memset(my_array, 0, 10 * sizeof(int));
+
+ for(i = 0; i < 11; i++)
+ printf("%d ", my_array[i]);
+
+ printf("\n");
+ return 0;
+}
+\end{lstlisting}
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ gcc -g -o array_access array_access.c
+./array_access 0 0 0 0 0 0 0 0 0 0 135121
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{libDUMA / electric fence: Überschriebener Speicher}
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ gcc -g -o array_access array_access.c -lduma
+$ ulimit -c unlimited
+$ ./array_access
+Segmentation fault (core dumped)
+$ gdb array_access core
+Loaded symbols for /lib64/ld-linux-x86-64.so.2
+Core was generated by `./array_access'.
+Program terminated with signal 11, Segmentation fault.
+#0 0x00000000004006b7 in main () at array_access.c:10
+10 printf("%d\n", my_array[i]);
+(gdb) print i
+$1 = 10
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{libDUMA / electric fence: Überschriebener Speicher}
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{9}{9}\selectfont]
+$ gcc -g -o array_access array_access.c
+$ LD_PRELOAD=/usr/lib/libduma.so ./array_access
+Segmentation fault (core dumped)
+[...]
+\end{lstlisting}
+\end{frame}
+
+\section{Eclipse}
+\begin{frame}
+\frametitle{Eclipse: Download}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_download.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Plug-Ins installieren}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_install_new.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Plug-Ins installieren}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_install_rse.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Plug-Ins installieren}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_install_cdt.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Plug-Ins installieren}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_install_details.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Plug-Ins installieren}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_install_license.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_new_c.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Download}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/eclipse_new_select.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/eclipse_new_advanced.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_new_comp.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_new_link.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_new_asm.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_new_disc-debug.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_new_disc-release.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_build_all.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: C Cross-Projekt}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_overview.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_debug_config.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_debug_remote_base.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_debug_base_settings.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/eclipse_remote_linux.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/eclipse_remote_hostname.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/eclipse_remote_ftp.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/eclipse_remote_process.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/eclipse_remote_shell.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/eclipse_remote_terminal.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_remote_select.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_remote_debugger.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_remote_gdbserver.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=5cm]{images/eclipse_remote_pass.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/eclipse_remote_remember.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote Debugging}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_remote_debug_per.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote System Explorer}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_open_perspective.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote System Explorer}
+\begin{figure}[h]
+\centering
+\includegraphics[width=5cm]{images/eclipse_open_rse.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote System Explorer}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_rse_files.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote System Explorer}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_rse_terminal0.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Eclipse: Remote System Explorer}
+\begin{figure}[h]
+\centering
+\includegraphics[width=10cm]{images/eclipse_rse_terminal1.png}
+\end{figure}
+\end{frame}
+
+\section{Hardware Debugging / JTAG}
+\begin{frame}
+\frametitle{OpenOCD}
+\begin{alertblock}{Freie Software für:}
+\begin{itemize}
+\item On-Chip Debugging
+\item In-System Programming
+\item Boundary-Scan Testing
+\end{itemize}
+\end{alertblock}
+\end{frame}
+
+\begin{frame}
+\frametitle{Testaufbau}
+\begin{figure}[h]
+\centering
+\includegraphics[width=5cm]{images/jtag.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{OpenOCD}
+\begin{verbatim}
+openocd -f interface/jtagkey2.cfg \
+ -f board/olimex_sam9_l9260.cfg
+\end{verbatim}
+\begin{verbatim}
+telnet localhost 4444
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{interface/jtagkey2.cfg}
+\begin{verbatim}
+interface ft2232
+ft2232_device_desc "Amontec JTAGkey-2"
+ft2232_layout jtagkey
+ft2232_vid_pid 0x0403 0xCFF8
+jtag_rclk 3000
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{board/olimex\_sam9\_l9260.cfg}
+\begin{verbatim}
+source [find target/at91sam9260.cfg]
+$_TARGETNAME configure -event reset-start {
+ jtag_rclk 5
+ halt
+ mww phys 0xfffffd08 0xa5000501
+}
+$_TARGETNAME configure -event reset-init {
+ mww 0xfffffd44 0x00008000
+
+ puts "Setting up clock"
+ mww 0xfffffc20 0x00004001
+ sleep 20
+[...]
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{OpenOCD: NAND konfigurieren}
+board/olimex\_sam9\_l9260.cfg
+\tiny
+\begin{verbatim}
+nand device at91sam9260.flash at91sam9 at91sam9260.cpu 0x40000000 0xffffe800
+at91sam9 cle 0 22
+at91sam9 ale 0 21
+at91sam9 rdy_busy 0 0xfffff800 13
+at91sam9 ce 0 0xfffff800 14
+[...]
+nand probe 0
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{OpenOCD: NAND Zugriffe}
+\tiny
+\begin{verbatim}
+Configuring SDRAM
+Configuring NAND flash
+NAND flash device 'NAND 512MiB 3.3V 8-bit (Samsung)' found
+Setting up dataflash
+NOTE! Severe performance degradation without fast memory access enabled. Type
+'help fast'.
+> nand raw_access 0 enable
+raw access is enabled
+> nand dump 0 /home/devel/work/dump.bin 0 131072
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{OpenOCD: NAND löschen}
+\begin{verbatim}
+[...]
+> nand erase 0 0 0x60000
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{OpenOCD: NAND schreiben}
+\begin{verbatim}
+[...]
+> nand write 0 /home/devel/work/bootloader.bin 0
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{OpenOCD: Breakpoints / Single-Step}
+\tiny
+\begin{verbatim}
+[...]
+> reset halt
+> bp 0x0020011c 0x04 hw
+> resume
+target state: halted
+target halted in ARM state due to breakpoint, current mode: Supervisor
+cpsr: 0x60000093 pc: 0x0020011c
+MMU: disabled, D-Cache: disabled, I-Cache: disabled
+> step
+target state: halted
+target halted in ARM state due to breakpoint, current mode: Supervisor
+cpsr: 0x60000093 pc: 0x00200280
+MMU: disabled, D-Cache: disabled, I-Cache: disabled
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{OpenOCD: GDB Schnittstelle}
+\tiny
+\begin{verbatim}
+$ arm-none-linux-gnueabi-gdb sam9_l9260-nandflashboot-2.4.elf
+[...]
+(gdb) directory at91bootstrap-2.4-olimex
+(gdb) target remote localhost:3333
+Remote debugging using localhost:3333
+[...]
+(gdb) monitor reset halt
+RCLK - adaptive
+[...]
+(gdb) hbreak main
+Hardware assisted breakpoint 1 at 0x20011c: file main.c, line 68.
+(gdb) c
+Continuing.
+Breakpoint 1, main () at main.c:68
+68 hw_init();
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{OpenOCD: GDB Schnittstelle}
+\tiny
+\begin{verbatim}
+(gdb) c
+Continuing.
+Breakpoint 1, main () at main.c:68
+68 hw_init();
+(gdb) next
+83 load_nandflash(IMG_ADDRESS, IMG_SIZE, JUMP_ADDR);
+(gdb) next
+84 dbg_print(">NANDflash ready\r\n");
+(gdb) step
+dbg_print (ptr=0x200e2c ">NANDflash ready\r\n") at driver/debug.c:90
+90 }
+\end{verbatim}
+\end{frame}
+
+\include{tailpres}