172 lines
5.4 KiB
TeX
172 lines
5.4 KiB
TeX
\documentclass[a4paper,12pt]{article}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage{listings}
|
|
\usepackage{xcolor}
|
|
\usepackage{geometry}
|
|
\geometry{margin=1in}
|
|
|
|
% Configure listings for C code
|
|
\lstset{
|
|
language=C,
|
|
basicstyle=\ttfamily\small,
|
|
keywordstyle=\color{blue}\bfseries,
|
|
stringstyle=\color{red},
|
|
commentstyle=\color{green!50!black},
|
|
numbers=left,
|
|
numberstyle=\tiny,
|
|
stepnumber=1,
|
|
numbersep=5pt,
|
|
showspaces=false,
|
|
showstringspaces=false,
|
|
frame=single,
|
|
breaklines=true,
|
|
breakatwhitespace=true,
|
|
tabsize=4
|
|
}
|
|
|
|
% Configure listings for GDB commands
|
|
\lstdefinestyle{gdb}{
|
|
basicstyle=\ttfamily\small,
|
|
numbers=left,
|
|
numberstyle=\tiny,
|
|
stepnumber=1,
|
|
numbersep=5pt,
|
|
showspaces=false,
|
|
showstringspaces=false,
|
|
frame=single,
|
|
breaklines=true,
|
|
breakatwhitespace=true
|
|
}
|
|
|
|
\title{Debugging the \texttt{slen} Function with GDB}
|
|
\author{}
|
|
\date{May 22, 2025}
|
|
|
|
\begin{document}
|
|
|
|
\maketitle
|
|
|
|
\section{Introduction}
|
|
This document describes the \texttt{slen} function, a C function that calculates the length of a null-terminated string, and details the debugging process using GDB on an embedded target. The debugging session history is included to illustrate the steps taken to verify the function's correctness.
|
|
|
|
\section{The \texttt{slen} Function}
|
|
The \texttt{slen} function takes a string pointer and returns the number of characters until the null terminator (\texttt{\textbackslash 0}). Below is the source code:
|
|
|
|
\begin{lstlisting}
|
|
#include <stdint.h>
|
|
|
|
const char * ptr = "informatyk mpabi 0\n";
|
|
|
|
int slen ( char *s ) {
|
|
int n;
|
|
for (n = 0; *s != '\0'; s++)
|
|
n++;
|
|
return n;
|
|
}
|
|
|
|
int main () {
|
|
int x = slen (ptr);
|
|
return 0;
|
|
}
|
|
\end{lstlisting}
|
|
|
|
The string \texttt{ptr} points to \texttt{"informatyk mpabi 0\textbackslash n"}, and \texttt{slen} is called to compute its length, stored in \texttt{x}.
|
|
|
|
\section{Debugging Strategy}
|
|
The debugging process uses GDB with a remote target (port 3333) to verify the \texttt{slen} function. The strategy includes:
|
|
\begin{itemize}
|
|
\item \textbf{Setup}: Connect to the target, load the program, and set breakpoints.
|
|
\item \textbf{Execution Control}: Step through instructions and continue to breakpoints to inspect \texttt{slen}'s execution.
|
|
\item \textbf{Memory Inspection}: Verify the string pointer and memory contents.
|
|
\item \textbf{State Monitoring}: Use the GDB dashboard to track registers, stack, and memory.
|
|
\item \textbf{Iterative Testing}: Reset and reload the program to ensure consistent behavior.
|
|
\end{itemize}
|
|
|
|
\section{GDB Command History}
|
|
The following GDB commands were executed to debug \texttt{slen}:
|
|
|
|
\begin{lstlisting}[style=gdb]
|
|
target extended-remote :3333
|
|
file prog
|
|
load
|
|
si
|
|
b main
|
|
dashboard -layout registers stack memory
|
|
c
|
|
si
|
|
c
|
|
si
|
|
c
|
|
laod % typo, likely meant load
|
|
load
|
|
c
|
|
c
|
|
c
|
|
radix 16
|
|
set radix 16
|
|
p/x ptr
|
|
p/x *ptr
|
|
p/c *ptr
|
|
p/s *ptr
|
|
print &ptr
|
|
p ptr
|
|
dashboard memory set 0x800000c0 32
|
|
dashboard memory watch 0x800000c0 32
|
|
dash
|
|
p/x &ptr
|
|
p/x ptr
|
|
p/x *ptr
|
|
dash
|
|
dash
|
|
clear
|
|
dash
|
|
si
|
|
monitor reset halt
|
|
si
|
|
si
|
|
exit
|
|
target extended-remote :3333
|
|
dash
|
|
dashboard -layout registers stack memory breakpoints
|
|
file prog
|
|
load
|
|
si
|
|
exit
|
|
dashboard -layout registers stack memory breakpoints
|
|
exit
|
|
dashboard -layout registers memory breakpoints stack
|
|
file prog
|
|
load
|
|
si
|
|
exit
|
|
\end{lstlisting}
|
|
|
|
\subsection{Explanation of Commands}
|
|
\begin{itemize}
|
|
\item \texttt{target extended-remote :3333}: Connects to the embedded target on port 3333.
|
|
\item \texttt{file prog}, \texttt{load}: Loads the executable \texttt{prog} onto the target.
|
|
\item \texttt{b main}, \texttt{c}: Sets a breakpoint at \texttt{main} and continues execution to it.
|
|
\item \texttt{si}: Steps through instructions, allowing inspection of \texttt{slen}'s loop.
|
|
\item \texttt{p/x ptr}, \texttt{p/x *ptr}, \texttt{p/c *ptr}, \texttt{p/s *ptr}: Inspects the \texttt{ptr} address, its first character (hex and char), and the full string.
|
|
\item \texttt{print \&ptr}, \texttt{p/x \&ptr}: Checks the address of \texttt{ptr} itself.
|
|
\item \texttt{dashboard memory set 0x800000c0 32}, \texttt{dashboard memory watch 0x800000c0 32}: Monitors 32 bytes at address \texttt{0x800000c0}, likely where the string resides.
|
|
\item \texttt{dashboard -layout ...}: Configures the GDB dashboard to show registers, stack, memory, and breakpoints.
|
|
\item \texttt{monitor reset halt}: Resets the target and halts execution.
|
|
\item \texttt{clear}, \texttt{exit}: Clears breakpoints and exits GDB sessions.
|
|
\item \texttt{radix 16}, \texttt{set radix 16}: Sets hexadecimal output for memory and values.
|
|
\item \texttt{dash}: Likely a custom alias or typo, possibly for dashboard commands.
|
|
\end{itemize}
|
|
|
|
\section{Key Checks for \texttt{slen}}
|
|
The debugging process verifies:
|
|
\begin{itemize}
|
|
\item \textbf{Pointer Validity}: \texttt{ptr} points to the correct string (checked via \texttt{p/s *ptr}).
|
|
\item \textbf{Loop Correctness}: The loop in \texttt{slen} increments \texttt{n} and stops at \texttt{\textbackslash 0} (inspected via \texttt{si}).
|
|
\item \textbf{Memory Access}: Memory at \texttt{0x800000c0} is valid and uncorrupted (via \texttt{dashboard memory watch}).
|
|
\end{itemize}
|
|
|
|
\section{Conclusion}
|
|
The GDB command history provides a detailed view of the debugging process, ensuring \texttt{slen} correctly computes the string length. The iterative use of stepping, memory inspection, and state monitoring confirms the function's behavior on the embedded target.
|
|
|
|
\end{document}
|