2010-07-18 1 views
0

Можете ли вы сказать мне, что в коде что-то не так, мое приложение случайно разбивается Я не могу найти никакой логической ошибки или ошибки памяти, пожалуйста, помогите, поскольку это выходит из моей сферы действия ,Программирование/память/логическая проблема в коде

#define __FN__ "CGD9_gd_ParseAddFieldsProC" 
int CGD9_gd_ParseAddFieldsProC (CGD_gd_ParseAddFields_Iparam_t *i_param_st_p) 
{ 

    t_gd9adfld_t *p_ext_fields_s = NULL; 
    t_gd9sbdat_t *p_buff = 
        (t_gd9sbdat_t *)(i_param_st_p->i_add_fields_st); 

    Trace(__FN__); 

    DEBUG_GD_1("\n\n Function %s - started. \n\n", __FN__); 

    if(*(i_param_st_p->o_add_fields) == NULL) { 
    ERR_Report_1(DGD_ERR_IN_FUNCTION, 
    __FN__ "ERROR - program will crash, input extended struct\ 
has not been initialized!"); 

    ERR_Report_1(DGD_ERR_IN_FUNCTION, __FN__\ 
"Check that exit point CMI9_auxc_A_GUIDING_init_forProc \ 
is used in GD table!"); 

    fflush(NULL); 
    return FAILURE; 
    } 

    p_ext_fields_s = *(i_param_st_p->o_add_fields); 

    memset (p_ext_fields_s, ' ', sizeof (t_gd9adfld_t)); 

/* Copy all extended fields from GD tables to buffer one by one*/ 

     memcpy(&p_ext_fields_s->rowid, 
      &p_buff[i_param_st_p->output_index].rowid, 
      sizeof(p_buff[i_param_st_p->output_index].rowid)); 

    memset(p_ext_fields_s->rowid,'0',18); 


     memcpy(&p_ext_fields_s->l9_legacy_prod_type, 
      &p_buff[i_param_st_p->output_index].l9_legacy_prod_type, 
      sizeof(p_ext_fields_s->l9_legacy_prod_type)); 


    /* Free the memory allocated for extended fields */ 

    free(i_param_st_p -> i_add_fields_st); 
    i_param_st_p -> i_add_fields_st = NULL; 

    DEBUG_GD_1("\n\n Function %s - completed successuflly. \n\n", __FN__); 

    return SUCCESS; 
} 
+0

Большинство компиляторов предопределяют макрос с именем функции для вас - обычно '__FUNCTION__' или что-то близкое. Это, по крайней мере, спасло бы вас от этого. –

+0

Ваш отладчик должен сказать вам, какая строка сбой, и дать вам обратную линию, чтобы узнать, как вы попали в это состояние. Что вы сделали до сих пор? –

+0

точка выхода была написана на верхнем уровне, и оттуда я использовал ее для создания своего собственного кода на нижнем уровне. pstack: ffffffff6e908e84 CGD9_gd_ParseAddFieldsProC (ffffffff427eecd8, 0, 1144963b0, 10e318c90, 1144963b0, ffffffff427ef098) + 13с – Kimi

ответ

3

Выстрел в темноте:

Вы используете

memcpy(&p_ext_fields_s->rowid ... 

но

memset(p_ext_fields_s->rowid ...

Так что, возможно, должны быть

memset(&p_ext_fields_s->rowid,

вместо этого? Но если это действительно была проблема, я бы ожидать, что это не случайно аварии, но аварии каждый раз, когда ...

+0

сбой каждый раз. но несколько раз он запускается в течение 3 часов и несколько раз только за 2 минуты – Kimi

0

Почему вы используете SizeOf() в первом случае, а затем постоянный размер () В секунду?

memcpy(&p_ext_fields_s->rowid, 
    &p_buff[i_param_st_p->output_index].rowid, 
    sizeof(p_buff[i_param_st_p->output_index].rowid)); 

memset(p_ext_fields_s->rowid,'0',18); 

PS я предлагаю запустить свой код с проверкой памяти инструмента (как я подозреваю, развращение памяти).

+0

одна вещь, которую я хочу подтвердить, смотря на вышеуказанную запись, если код будет таким: memset (& p_ext_fields_s-> rowid, '0', sizeof (p_buff [i_param_st_p-> output_index] .rowid)); – Kimi

+0

(&) оператор должен быть там – Kimi

+0

Почему вы не исправили то же самое? – pmod

0

Код врезаться на свободное распределение памяти:

free(i_param_st_p -> i_add_fields_st); 

Что плохого в THT: <?

Смежные вопросы