Frustrated by gdb tutorials that are either too complicated or too simple? I think this might be an actually-useful tutorial to help you see how and why gdb can be useful. Anyway, it's the path I followed to finding a use for the mysterious gdb, so maybe it will work for you.
To follow along with this episode, here's some simple yet buggy code. This compiles but crashes when run.
#include <iostream>
#include <stdlib.h> // rand
#include <stdio.h> // printf
using namespace std;
int main () {
srand (time(NULL));
int penguin = rand() % 8;
cout << "This is a message from your friendly coder\n" << endl;
int kiwi = 3;
printf("penguin is set to is %s\n", penguin);
printf("kiwi is set to is %s\n", kiwi);
return 0;
} // main
To compile it and see it crash, do this:
$ g++ example.cpp
$ ./a.out
To compile it with debug symbols so you can step through it in gdb, do this:
$ g++ -g -o debugtest example.cpp
$ gdb debugtest
You can now follow along with this tutorial.
For extra credit, try compiling this with clang++ instead!