2017-03-16 89 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; 
} 

崩溃发生在init方法的“return global”处。 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))  

因此你的程序具有不确定的行为最终导致崩溃。