2012-06-18 44 views
2

我寫了一個簡單的C++測試程序來測試例外的Android NDK工具鏈異常處理賽格故障

#include <iostream> 
#include <string> 

inline bool isNumber(char c); 

inline unsigned stringToNum(const char *str) { 
    unsigned x = 0; 
    const char *p = str; 
    while(1) { 
     if(!isNumber(*p)) { 
      if(*p == 0 && p != str) 
       break; 
      throw 0; 
     } 
     x = x * 10 + *p++ - '0'; 
    } 
    return x; 
} 

inline bool isNumber(char c) { 
    return c >= '0' && c <= '9'; 
} 

int main() { 
    std::string k = std::string("test"); 
    try { 
     int p = stringToNum(k.c_str()); 
    } catch(...) { 
     std::cout << "EXCEPTION THROWN"; 
    } 
} 

我編譯兩個階段的程序(我試圖模擬誤差與存在的更大的圖書館)。第一步看起來像

/Users/me/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/darwin-x86/bin/i686-android-linux-g++ -c -fexceptions -frtti -Wnon-virtual-dtor -Woverloaded-virtual --sysroot "/Users/me/android-ndk-r8/platforms/android-14/arch-x86/" -fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -O3 -Wl,-rpath-link=/Users/me/android-ndk-r8/platforms/android-14/arch-x86/usr/lib/ -L/Users/me/android-ndk-r8/platforms/android-14/arch-x86/usr/lib/ -nostdlib /Users/me/android-ndk-r8/platforms/android-14/arch-x86/usr/lib/crtbegin_dynamic.o -lc -lm -I/Users/me/android-ndk-r8/sources/cxx-stl/gnu-libstdc++/include -I/Users/me/android-ndk-r8/sources/cxx-stl/gnu-libstdc++/libs/x86/include exceptiontest.cpp 

然後:

/Users/me/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/darwin-x86/bin/i686-android-linux-g++ -fexceptions -fPIC -pthread -rdynamic --sysroot "/Users/me/android-ndk-r8/platforms/android-14/arch-x86/" -fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -O3 -Wl,-rpath-link=/Users/me/android-ndk-r8/platforms/android-14/arch-x86/usr/lib/ -L/Users/me/android-ndk-r8/platforms/android-14/arch-x86/usr/lib/ -nostdlib /Users/me/android-ndk-r8/platforms/android-14/arch-x86/usr/lib/crtbegin_dynamic.o -lc -lm exceptiontest.o -L/Users/me/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/darwin-x86/lib/gcc/i686-android-linux/4.4.3 -L/Users/me/android-ndk-r8/sources/cxx-stl/gnu-libstdc++/libs/x86 -lgnustl_shared -lgcc 

當我在設備上運行的a.out(與libgnustl_shared.so複製到libs目錄),我得到一個段錯誤。我錯過了什麼?編譯器標誌?圖書館?等

編輯:繼承人的段錯誤關閉GDB的堆棧跟蹤

#0 get_cie_encoding (cie=0x6107daff) at /Users/andrewhsieh/ndk-andrewhsieh/src.1-with-cherrypicks//build/../gcc/gcc-4.4.3/libgcc/../gcc/unwind-dw2-fde.c:267 
#1 0x080b16d8 in classify_object_over_fdes (ob=0x80d8b68, this_fde=0x80d0a1c) at /Users/andrewhsieh/ndk-andrewhsieh/src.1-with-cherrypicks//build/../gcc/gcc-4.4.3/libgcc/../gcc/unwind-dw2-fde.c:615 
#2 0x080b1a5d in search_object (ob=0x80d8b68, pc=<value optimized out>) at /Users/andrewhsieh/ndk-andrewhsieh/src.1-with-cherrypicks//build/../gcc/gcc-4.4.3/libgcc/../gcc/unwind-dw2-fde.c:726 
#3 0x080b1f84 in _Unwind_Find_FDE (pc=0x80b10da, bases=0xbfa61204) at /Users/andrewhsieh/ndk-andrewhsieh/src.1-with-cherrypicks//build/../gcc/gcc-4.4.3/libgcc/../gcc/unwind-dw2-fde.c:989 
#4 0x080b07db in uw_frame_state_for (context=<value optimized out>, fs=0xbfa6102c) at /Users/andrewhsieh/ndk-andrewhsieh/src.1-with-cherrypicks//build/../gcc/gcc-4.4.3/libgcc/../gcc/unwind-dw2.c:1128 
#5 0x080b0af8 in uw_init_context_1 (context=0xbfa61230, outer_cfa=<value optimized out>, outer_ra=0x809aa14) at /Users/andrewhsieh/ndk-andrewhsieh/src.1-with-cherrypicks//build/../gcc/gcc-4.4.3/libgcc/../gcc/unwind-dw2.c:1447 
#6 0x080b10db in _Unwind_RaiseException (exc=0x944d060) at /Users/andrewhsieh/ndk-andrewhsieh/src.1-with-cherrypicks//build/../gcc/gcc-4.4.3/libgcc/../gcc/unwind.inc:88 
#7 0x0809aa14 in __cxa_throw() 
#8 0x0804b4a7 in main() at exceptiontest.cpp:13 
+0

訪問**無效**內存位置時會導致分段錯誤。看看線程更簡單的轉換方式。[std :: string to int](http://stackoverflow.com/questions/200090/how-do-you-convert-ac-string-to-an-int) – Mahesh

+0

我知道這不是錯誤的原因(它爲主機平臺編譯時運行完美)。這與android ndk是如何設置的例外情況有關。 – MEURSAULT

回答

0

正確答案:Android NDK R5 and support of C++ exception

不正確的答案舊(這不再true.Thanks克里斯指點出來):

Android平臺不支持C++中的異常。這在仿生文件中有明確說明。此外,您可以閱讀this thread on the android-ndk google group以獲得關於此主題的詳細討論。

+1

這已經過時了。在ndk-r5b中添加了異常支持,請參閱http://stackoverflow.com/questions/4663291/android-ndk-r5-and-support-of-c-exception,其中提到了一個可能很重要的選項標誌。 –