Nice gdb command: thread apply all bt
(gdb) where #0 0x405743df in strftime (s=0xbfffeaf0 "8\uffff \b\uffffo!\b\030\uffff\uffff\uffffG@E\002", maxsize=100, format=0x0, tp=0x40612380) at strftime.c:603 #1 0x080944c2 in jp_strftime (s=0xbfffeaf0 "8\uffff \b\uffffo!\b\030\uffff\uffff\uffffG@E\002", max=100, format=0xbfffea80 "\u7bc1\212\uffff\227\u30e3\201\uffff %A, %B%d\u65e5,%Y\u5e74 %I:%M:%S %p", tm=0x40612380) at utils.c:3003 #2 0x0808ffe3 in timeout_date (data=0x0) at utils.c:202 #3 0x0806ae31 in datebook_gui (vbox=0x8220800, hbox=0x82105c8) at datebook_gui.c:4089 #4 0x080755d4 in main (argc=1, argv=0xbffff984) at jpilot.c:2675 #5 0x404eec1f in __libc_start_main (main=0x8073cd8 <main>, argc=1, ubp_av=0x1, init=0x8095274 <__libc_csu_init>, fini=0x80952bc <__libc_csu_fini>, rtld_fini=0x400144a0 <_rtld_local>, stack_end=0x0) at ../sysdeps/generic/libc-start.c:225
1) If your program is not already compiled with debugging symbols in it, please add them, in one of the following ways: 1a) If you are using a vendor C compiler, like xlc, then please add "-g" to all of your xlc invocations, both compile and link. 1b) If you are using gcc, please do the same, but you can use -g or -ggdb in most cases. -ggdb is supposed to provide better information, I believe 2) Run your program again. 3) Locate the resulting core file. If none was produced, you may have to use "ulimit -c 8192" in a POSIX shell (sh/ksh/bash) to get a core file to be created. csh/tcsh can do the same, but the syntax is different. 4) cd to the directory containing the core file 5) Run one of the following commands: 5a) gdb myprog core 5b) dbx myprog core 6) Get a "backtrace" using one of the following commands: 6a) Under gdb, use "thread apply all bt" and/or "where" 6b) Under dbx, use "where" and "dump" 6c) In both of these debuggers, you can examine variables
Single stepping in AIX 5.1 dbx: esmf04m-strombrg> dbx ./t Type 'help' for help. reading symbolic information ... (dbx) list 1 #include <stdio.h> 2 3 int main() 4 { 5 fn1(); 6 return 0; 7 } 8 9 int fn1() 10 { (dbx) stop 5 expected variable, found 5 (dbx) stop at 5 [1] stop at 5 (dbx) run [1] stopped in main at line 5 5 fn1(); (dbx) list 6 return 0; 7 } 8 9 int fn1() 10 { 11 fn2(); 12 } 13 14 int fn2() 15 { (dbx) step stopped in fn1 at line 11 11 fn2(); (dbx) list 1,100 1 #include <stdio.h> 2 3 int main() 4 { 5 fn1(); 6 return 0; 7 } 8 9 int fn1() 10 { 11 fn2(); 12 } 13 14 int fn2() 15 { 16 int i; 17 char *p=NULL; 18 printf("hello\n"); 19 for (i=0; i<100; i++) 20 { 21 if (i > 50) 22 { 23 *(p) = '\0'; 24 } 25 } 26 } 27 28 (dbx) step stopped in fn2 at line 17 17 char *p=NULL; (dbx) step stopped in fn2 at line 18 18 printf("hello\n"); (dbx) print p (nil) (dbx) print i -1159983106 (dbx)
oracle's opensource projects page has a "gdb pstack" that can get a stack trace of a running program
Nice table comparing gdb and sun dbx: http://www.fortran-2000.com/ArnaudRecipes/CompGdbDbx.html
Using dbx to break at a specific point in a large C++ program: esmf04m-root> dbx ../../netcdf-handler/src/dap_nc_handler Type 'help' for help. reading symbolic information ... (dbx) help file file file <filename> Change the current source file name to <filename>. If none is specified then the current source file name is printed. (dbx) file InternalErr.cc (dbx) stop in InternalErr::InternalErr 1. InternalErr.InternalErr::InternalErr(const InternalErr&) 2. InternalErr.InternalErr::InternalErr() 3. InternalErr.InternalErr::InternalErr(std::basic_string<char,std::char_traits<char>,std::allocator<char> >,ProgramType,char*) 4. InternalErr.InternalErr::InternalErr(const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&,const int&,const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&) 5. InternalErr.InternalErr::InternalErr(const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&) Select one or more of [1 - 5]: 1,2,3,4,5 [1] stop in InternalErr.InternalErr::InternalErr(const InternalErr&) [2] stop in InternalErr.InternalErr::InternalErr() [3] stop in InternalErr.InternalErr::InternalErr(std::basic_string<char,std::char_traits<char>,std::allocator<char> >,ProgramType,char*) [4] stop in InternalErr.InternalErr::InternalErr(const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&,const int&,const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&) [5] stop in InternalErr.InternalErr::InternalErr(const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&) (dbx) run -v DAP2/3.5.1 -o dds -u http://esmf.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata/in.nc /usr/local/apache-2.0.55/htdocs/dodsdata/in.nc -r /usr/tmp [5] stopped in InternalErr.InternalErr::InternalErr(const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&) at line 55 in file "InternalErr.cc" ($t1) 55 InternalErr::InternalErr(const string &msg) : Error() (dbx) list 50,60 50 InternalErr::InternalErr() : Error() 51 { 52 _error_code=internal_error; 53 } 54 55 InternalErr::InternalErr(const string &msg) : Error() 56 { 57 _error_code=internal_error; 58 _error_message=""; 59 _error_message+="An internal error was encountered:\n"; 60 _error_message+=msg+"\n"; (dbx) where InternalErr.InternalErr::InternalErr(const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&)(this = 0x0ffffffffff60510, msg = &(...)), line 55 in "InternalErr.cc" unnamed block $b2885, line 501 in "BaseType.cc" unnamed block $b2884, line 501 in "BaseType.cc" set_parent(BaseType*)(0x110223390, 0x110223230), line 501 in "BaseType.cc" unnamed block $b3163, line 897 in "Vector.cc" unnamed block $b3161, line 897 in "Vector.cc" add_var(BaseType*,Part)(0x110223230, 0x110223130, 0x0), line 897 in "Vector.cc" add_var(BaseType*,Part)(0x110223230, 0x110223130, 0x0), line 173 in "Array.cc" unnamed block $b190, line 228 in "ncdds.cc" unnamed block $b188, line 228 in "ncdds.cc" read_class(DDS&,int,int,std::basic_string<char,std::char_traits<char>,std::allocator<char> >*)(0xfffffffffffefe8, 0x300000003, 0x1600000016, 0x9000000014f7eb0), line 228 in "ncdds.cc" unnamed block $b201, line 304 in "ncdds.cc" read_descriptors(DDS&,const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&)(0xfffffffffffefe8, 0xffffffffffff110), line 304 in "ncdds.cc" unnamed block $b216, line 71 in "nc_handler.cc" unnamed block $b213, line 71 in "nc_handler.cc" main(argc = 10, argv = 0x0ffffffffffff668), line 71 in "nc_handler.cc" (dbx) dump InternalErr.InternalErr::InternalErr(const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&)(this = 0x0ffffffffff60510, msg = _String_base:() _String_val<char,std::allocator<char> >:(_Alval = ()) (_Ptr = "Call to set_parent with incorrect variable type.", _Len = 48, _Res = 63)), line 55 in "InternalErr.cc" (dbx)