Easy coredump example (Apport, GDB)

Setup apport

$ cd ~/.config && mkdir apport && cd apport && touch settings
~/.config/apport$ printf "[main]\nunpackaged=true\n" >> settings

Source code

class Player {
public:
  enum PlayerState {
    STOPPED,
    PLAYING,
    PAUSED
  };
  Player() : m_State(STOPPED) {}
  void play() { m_State = PLAYING; }
  void paused() { m_State = PAUSED; }
  void stop() { m_State = STOPPED; }
private:
  PlayerState m_State;
};

int main() {
  Player* player;
  player->play();
  return 0;
}

Coredump analysis

$ g++ main.cpp -g
$ ./a.out
Segmentation fault (core dumped)
$ apport-unpack /var/crash/<core_dump> <dest_dir>

$ gdb a.out <dest_dir>/CoreDump
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000004004fe in Player::play (this=0x0) at main.cpp:9
9	  void play() { m_State = PLAYING; }
(gdb) bt
#0  0x00000000004004fe in Player::play (this=0x0) at player.cpp:11
#1  0x00000000004004ea in main () at player.cpp:21
(gdb) up
(gdb) info locals
player = 0x0
(gdb) p player
$1 = (Player *) 0x0
(gdb) p *player
Cannot access memory at address 0x0

Issue: player hasn’t been initialized before calling play().