2017-03-16 7 views
-1

Googleソースの一部であるネイティブアプリを強化しています。私はクラッシュを見ている。私はこれをデバッグしようとしましたが、結論できませんでした。Androidのネイティブプロセス:スタックの破損が検出されました

struct device_global { 
    struct support *sport; 
    struct support_params params; 
    struct global_priv *ctrl; 

#if defined FEATURE_1 
    int freq, freq_2; 
#endif /* FEATURE_1 */ 

#ifdef FEATURE_2 
    int wifi_display; 
    #define SUBELEMS 10 
    struct buf *subelem[MAX_SUBELEMS]; 
#endif /* FEATURE_2 */ 

    struct list_entry *add_list_entry; 

#ifdef FEATURE_3 
    void* my_context; 
#endif /* FEATURE_3 */ 
}; 

typedef unsigned long  DWORD; 
typedef DWORD   *PDWORD; 

typedef struct 
{ 
    DWORD dwFlags; 
    DWORD dwErrorCode; 
    DWORD dwDeviceId; 

#ifdef FEATURE_X 
    CHAR* tableFileName; 
#endif 

#ifdef FEATURE_Y 
    FILE* tableFile; 
    DWORD headerVersion; 
    DWORD headerSize; 
#endif 
} CONTEXT1, *CONTEXT2; 


struct device_global * init(struct support_params *params) 
{ 
    struct device_global *global; 
    global = os_malloc(sizeof(*global)); 
    if (params->ctrl) 
      global->params.ctrl = os_strdup(params->ctrl); 
    // Assignment of other global variables done here like above (not added here to remove clutter) 

    int deviceId = 0; 
    if (0 == getDeviceId(global->my_context, (PDWORD) &deviceId)) 
    { 
     printf("Device ID 0x%x", deviceId); 
    } 
    printf("Before returning global"); // gets printed before crash 
    return global; // crashes here 
} 



DWORD getDeviceId(PVOID pContext, PDWORD myDeviceId) 
{ 
    CONTEXT2 myContext; 

    if (!pContext || !myDeviceId) 
    { 
     return -1; 
    } 
    else 
    { 
     myContext = (CONTEXT2) pContext; 
     *myDeviceId = myContext->dwDeviceId; 
    } 

    return 0; 
} 

"return global"のinitメソッドでクラッシュが起こっています。 printfステートメントが表示され、その後にクラッシュが表示されます。 貴重なご意見をお伝えください。

クラッシュに対応するエラーメッセージは次のとおりです。

03-16 12:30:03.230 5626 5626 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 
03-16 12:30:03.232 5626 5626 F DEBUG : Abort message: 'stack corruption detected' 
+0

そして、どこにグローバルメモリを割り当てていますか? – Selvin

+0

質問が編集されました。 mallocは 'init'メソッドで行われます。 – webgenius

+1

構造体内のすべてのポインタは、メモリ内のいくつかのランダムな点を指すようになりました。それらのすべての使用は、ひどく墜落するでしょう – Selvin

答えて

0

my_contextポインタは、ここで初期化されていません。

if (0 == getDeviceId(global->my_context, (PDWORD) &deviceId))  

したがって、あなたのプログラムは最終的にクラッシュにつながる未定義の挙動を示します。