\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 ") 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}