\documentclass{article}
\usepackage[a4paper, margin=2cm]{geometry}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[polish]{babel}
\usepackage{listings}
\usepackage{color}

\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}

\lstdefinestyle{mystyle}{
    backgroundcolor=\color{backcolour},   
    commentstyle=\color{codegreen},
    keywordstyle=\color{magenta},
    numberstyle=\tiny\color{codegray},
    stringstyle=\color{codepurple},
    basicstyle=\ttfamily\footnotesize,
    breakatwhitespace=false,         
    breaklines=true,                 
    captionpos=b,                    
    keepspaces=true,                 
    showspaces=false,                
    showstringspaces=false,
    showtabs=false,                  
    tabsize=2
}

\lstset{style=mystyle}

\begin{document}

\title{GDB and DASHBOARD}
\author{}
\date{}
\maketitle

\section{Dashboard memory watch}
Dashboard GDB pozwala na dynamiczne obserwowanie określonych obszarów pamięci. Używając funkcji \texttt{dashboard memory watch}, można ustawić obserwację na konkretne adresy pamięci.

\begin{lstlisting}[language=bash]
dashboard memory watch 0x1ff80 128 
\end{lstlisting}

\noindent
Powyższa komenda skonfiguruje dashboard do obserwacji 128 bajtów pamięci, począwszy od adresu \texttt{0x1ff80}.

\section{Obserwacja pamięci przy użyciu watch w GDB}
Aby obserwować pamięć na niskim poziomie w GDB, można użyć komendy \texttt{watch} w połączeniu z rzutowaniem i rozmiarem obserwowanego obszaru. Przykładowo, aby obserwować 128 bajty pamięci zaczynając od adresu \texttt{0x1ff80}, użyjemy następującej komendy:

\begin{lstlisting}[language=bash]
watch *(char*)0x1ff80 @ 128 
\end{lstlisting}

Ta komenda spowoduje przerwanie wykonania programu, gdy wartości w obserwowanym obszarze pamięci ulegną zmianie. Użycie rzutowania na typ \texttt{(char*)} pozwala na interpretację adresu jako wskaźnika na bajty, a operator \texttt{@} określa ilość obserwowanych bajtów.

\section{Clear Memory}

\subsection{Basic Usage}
To clear 128 bytes of memory starting from 0x1FF80, use the following script:

\begin{lstlisting}[language=bash]
#./gdb/zero.py

import gdb 
for i in range(0, 128): # 128 bajtów
    gdb.execute("set *((char*)0x1FF80 + %d) = 0" % i)                                    
\end{lstlisting}

Run this script from GDB dashboard by:

\begin{lstlisting}[language=bash]
source gdb/zero.py 
\end{lstlisting}

\subsection{Option 2: With Parameters}
To dynamically set the starting address, number of bytes, and pattern from the command line, modify the script as follows:

\begin{lstlisting}[language=bash]
#./gdb/zero_with_params.py

import gdb
import sys

# Parse arguments from the GDB command
args = gdb.string_to_argv(gdb.parameter("args"))
if len(args) != 3:
    print("Usage: source gdb/zero_with_params.py <start_address> <num_bytes> <pattern>")
else:
    start_address = int(args[0], 16)  # Convert start address from hex to int
    num_bytes = int(args[1], 16)      # Convert number of bytes from hex to int
    pattern = int(args[2], 16)        # Convert pattern from hex to int
    
    for i in range(num_bytes):
        gdb.execute("set *((char*)%d + %d) = %d" % (start_address, i, pattern))
\end{lstlisting}

To run this script with parameters, set GDB's `args` parameter before sourcing the script:

\begin{lstlisting}[language=bash]
set args 0x1FF80 0x80 0x30
source gdb/zero_with_params.py
\end{lstlisting}

This allows specifying the starting address, number of bytes to clear, and the pattern to use directly from the GDB command line.

\end{document}
