Fennel: /home/pub/open/dev/fennel/common/testBacktrace.cpp Source File (original) (raw)
00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 00025 00026 #include "fennel/common/CommonPreamble.h" 00027 #include "fennel/common/Backtrace.h" 00028 #include "fennel/common/ConfigMap.h" 00029 #include 00030 #include 00031 #include 00032 00033 FENNEL_BEGIN_CPPFILE("$Id: //open/dev/fennel/common/testBacktrace.cpp#6 $"); 00034 00035 class foo { 00036 void g(int); 00037 void h(int); 00038 void k(int); 00039 public: 00040 foo() {} 00041 ~foo() {} 00042 void f(int); 00043 }; 00044 00045 void foo::f(int n) 00046 { 00047 g(n); 00048 } 00049 00050 void foo::g(int n) 00051 { 00052 h(n); 00053 k(n); 00054 } 00055 00056 void foo::h(int n) 00057 { 00058 std::cerr << "\ntesting Backtrace(" << n << ")\n"; 00059 Backtrace bt(n); 00060 std::cerr << bt; 00061 } 00062 00063 void foo::k(int n) 00064 { 00065 void *addrs[32]; 00066 assert(n < 32); 00067 std::cerr << "\ntesting Backtrace(" << n << ", addrs)\n"; 00068 Backtrace bt(n, addrs); 00069 std::cerr << bt; 00070 } 00071 00072 FENNEL_END_CPPFILE("$Id"); 00073 00074 00075 00076 00077 00078 int main(int argc, char *argv) 00079 { 00080 if (argc == 1) { 00081 fennel::foo o; 00082 o.f(16); 00083 o.f(2); 00084 } else { 00085 fennel::AutoBacktrace::install(); 00086 switch (argv[1][0]) { 00087 case 'a': 00088 assert(false); 00089 std::cerr << "not reached\n"; 00090 break; 00091 case 'p': 00092 permAssert(false); 00093 std::cerr << "not reached\n"; 00094 break; 00095 case 'e': 00096 std::cerr << "throw new std::runtime_error("testing AutoBacktrace")\n"; 00097 throw new std::runtime_error("testing AutoBacktrace"); 00098 std::cerr << "not reached\n"; 00099 break; 00100 case 's': 00101 { 00102 fennel::ConfigMap configMap; 00103 configMap.readParams((std::istream *) NULL); 00104 } 00105 break; 00106 default: 00107 ; 00108 } 00109 } 00110 exit(0); 00111 } 00112 00113