Home | History | Annotate | Download | only in jni
      1 #include <new>
      2 #include <exception>
      3 #include <cstdio>
      4 
      5 /* Stubbed out in libdl and defined in the dynamic linker.
      6  * Same semantics as __gnu_Unwind_Find_exidx().
      7  */
      8 typedef long unsigned int *_Unwind_Ptr;
      9 extern "C" _Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc, int *pcount);
     10 extern "C" _Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc, int *pcount)
     11 {
     12     _Unwind_Ptr ret_pc;
     13     printf("%p -> ", pc);
     14     ret_pc = dl_unwind_find_exidx(pc, pcount);
     15     printf("%p %d\n", ret_pc, *pcount);
     16     return ret_pc;
     17 }
     18 static void* g_func_ptr;
     19 
     20 static void foo(void)
     21 {
     22     try
     23     {
     24         ::printf("Hello ");
     25         throw std::exception();
     26     } catch (const std::exception &e)
     27     {
     28         ::printf(" World!\n");
     29     }
     30 }
     31 
     32 int main(int argc, char** argv)
     33 {
     34     int count;
     35     g_func_ptr = (void*)__gnu_Unwind_Find_exidx;
     36 
     37     __gnu_Unwind_Find_exidx((_Unwind_Ptr)main, &count); // This one succeed
     38 
     39     // This one crash on Android <= 2.1.
     40     // The lcoal __gnu_Unwind_Find_exidx() isn't even called.
     41     // Need to recompile Android 2.1 from source and debug platform from there
     42     foo();
     43     return 0;
     44 }
     45