Using GDB to Dump Program State
Sometimes when a program is running for you want to dump the complete state of all the calls stacks of all threads in a program. This is not so easy to do yourself, but thankfully there are tools like GDB, the Gnu Debugger which can do this for you.
The idea is simple. Use a system call to execute a script that will start GDB, run commands to dump all stacks to a file and exit.
Running GDB in Command Mode
The first insight is that GDB can be run in a non-interactive mode where it attaches to a program runs some GDB commands and exits:
/bin/echo -e "set pagination off\nthread apply all backtrace\nquit\n" | gdb --pid 1234 > dump1234.dump
In the script above we echo the script into GDB. We use echo -e because that will interpret c-style character sequences allowing us to embed newlines.
We could just put these commands into a script file.. but since we want to run this command from within a c++ program, its easier to do it like this than have a separate script file to manage.
Executing it from Within a Program
This will work on any process that the calling process has permission to open. It can be ones own process or some other process that you need a dump of.
void dumpStacks( pid_t pid )
{
char buf[4096];
sprintf( buf,
"/bin/echo -e \"set pagination off\\nthread apply all \
backtrace\\nquit\\n\" | gdb --pid %d > dump%d.out",
pid, pid );
system( buf );
}
Not hard, but very useful.