inital commit
commit
7aefc92849
@ -0,0 +1,12 @@
|
||||
program: main.c
|
||||
gcc -g -o program main.c
|
||||
|
||||
debug: program
|
||||
gdb program
|
||||
|
||||
pdf: README.md
|
||||
pandoc README.md --pdf-engine=xelatex -o README.pdf
|
||||
|
||||
latex: README.md
|
||||
pandoc README.md -o README.tex
|
||||
|
@ -0,0 +1,94 @@
|
||||
---
|
||||
title: Debuging with gdb
|
||||
date: \today
|
||||
author: Jasper Levin Spahl
|
||||
documentclass: scrartcl
|
||||
lang: de
|
||||
papersize: a4
|
||||
|
||||
---
|
||||
|
||||
# How to debug with `gdb`
|
||||
|
||||
Given we have as simple C program with a bug
|
||||
|
||||
```c
|
||||
/* main.c */
|
||||
#include <stdio.h>
|
||||
int main()
|
||||
{
|
||||
int balance = 100;
|
||||
int target = 1000;
|
||||
float rate = 0.1;
|
||||
int yeat = 0;
|
||||
do
|
||||
{
|
||||
float interest = balance * rate;
|
||||
balance = balance + interest;
|
||||
year++
|
||||
} while ( balance >= target)
|
||||
printf("%d No. of years to achieve target balance.\n", year);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
To find bug we first have to compile the program with
|
||||
`gcc -g -o program main.c`.
|
||||
The `-g` flag is used to compile the program with debug symbols.
|
||||
Now that we have compiled the program we can open int `gdb`
|
||||
|
||||
Because we don't want to type all these long commands everytime we
|
||||
compile we can use a `Makefile` to make our lifes easyer.
|
||||
|
||||
```Makefile
|
||||
# Makefile
|
||||
program: main.c
|
||||
gcc -g -o program main.c
|
||||
debug: program
|
||||
gdb program
|
||||
```
|
||||
|
||||
Now writing `make debug` in the terminal will compile the program and
|
||||
open it in gdb.
|
||||
|
||||
To debug the program we first have to set a breakpoint
|
||||
```
|
||||
(gdb) b main
|
||||
Breakpoint 1 at 0x1141: file main.c, line4.
|
||||
```
|
||||
|
||||
To run the program in gdb type `run`
|
||||
```
|
||||
(gdb) run
|
||||
Starting program: program
|
||||
|
||||
Breakpoint 1, main () at main.c:4
|
||||
4 int balance = 100;
|
||||
```
|
||||
|
||||
To step with `s`
|
||||
```
|
||||
(gdb) s
|
||||
5 int target=1000;
|
||||
(gdb) s
|
||||
6 float rate = 0.1;
|
||||
(gdb) s
|
||||
7 int year = 0;
|
||||
(gdb) s
|
||||
10 float interest = balance * rate;
|
||||
(gdb) s
|
||||
11 balance = balance + interest;
|
||||
(gdb) s
|
||||
12 year++;
|
||||
```
|
||||
|
||||
At line `12` we want to take a look at the variables.
|
||||
The gdb command for that is `p`
|
||||
```
|
||||
(gdb) p balance
|
||||
$1 = 110
|
||||
(gdb) p rate
|
||||
$2 = 0.100000001
|
||||
(gdb) p interest
|
||||
$3 = 10
|
||||
```
|
@ -0,0 +1,15 @@
|
||||
#include <stdio.h>
|
||||
int main()
|
||||
{
|
||||
int balance = 100;
|
||||
int target = 1000;
|
||||
float rate = 0.1;
|
||||
int year = 0;
|
||||
do {
|
||||
float interest = balance * rate;
|
||||
balance = balance + interest;
|
||||
year++;
|
||||
} while ( balance < target );
|
||||
printf("%d No. of years to achieve target balance.\n", year);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue