[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: how can I get a backtrace from inside my program?
- From: jcupitt gmail com
- Cc: gtk-app-devel-list gnome org, Garth's KidStuff <garthskidstuff gmail com>
- Subject: Re: how can I get a backtrace from inside my program?
- Date: Fri, 31 Oct 2008 22:38:11 +0000
2008/10/31 Brian J. Tarricone <bjt23 cornell edu>:
> Garth's KidStuff wrote:
>> I have a large Gtk app running on Ubuntu and I'd love to be able to log
>> stack trace information when unusual events occur. Any ideas on where to
>> look for this?
>
> If you don't mind that it only works on Linux, with glibc and gcc, take a
> look at backtrace() and backtrace_symbols() (or backtrace_symbols_fd()).
> I've never used it myself, but that might be what you're looking for.
Another option (brace yourself, this is very hacky) is to start gdb,
attach to yourself, send a "bt" (backtrace) command, and capture the
output. It's slow, but it does work, sort of, and it would be slightly
more portable.
Of course your app will need to be built with -g, the user will need
to have gdb installed, and the ugly way I've done it in this scrap of
code is horribly insecure. You'd need to trim the output down a bit
too.
-----------
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
/* Largest output we can capture.
*/
#define MAX_TRACE (1024)
char *
getstacktrace( const char *argv0 )
{
pid_t pid = getpid();
char output[MAX_TRACE];
char cmd[256];
FILE *fp;
int i;
int ch;
snprintf( cmd, 256,
"echo bt > /tmp/poop | gdb -batch %s %d -x /tmp/poop",
argv0, pid );
if( !(fp = popen( cmd, "r" )) )
return( NULL );
for( i = 0; i < MAX_TRACE - 1 && (ch = fgetc( fp )) != EOF; i++ )
output[i] = ch;
output[i] = 0;
pclose( fp );
return( strdup( output ) );
}
int
main( int argc, char **argv )
{
char *trace;
if( (trace = getstacktrace( argv[0] )) ) {
printf( "stack trace:\n%s", trace );
free( trace );
}
return( 0 );
}
--------------
J
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]