2010-07-18 4 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 "목표 - C"에 (ffffffff427eecd8, 0, 1144963b0, 10e318c90, 1144963b0, ffffffff427ef098) + 13C – Kimi

답변

3

샷 :

당신이

memcpy(&p_ext_fields_s->rowid ... 

하지만

memset(p_ext_fields_s->rowid을 사용하고 ... 그래서 아마도

이 있어야한다

memset(&p_ext_fields_s->rowid,

대신에? 이건 정말 문제가 있다면, 나는 왜 사용합니까 ... 를 sizeof() 첫 번째 경우에 다음 일정한 크기 (18

+0

매번 충돌하고 있습니다. 하지만 몇 시간 동안은 3 시간 동안 만 실행되고 2 분 동안 만 실행됩니다 – Kimi

0

그것을 무작위로 충돌하지 예상하지만, 매번 충돌 것) 두 번째에?

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 나는 (I 메모리 손상을 의심으로) 메모리 검사 도구를 사용하여 코드를 실행 제안 것입니다.

+0

코드는 위와 같은 코드를 확인해야합니다. memset (& p_ext_fields_s-> rowid, '0', sizeof (p_buff [i_param_st_p-> output_index] .rowid)); – Kimi

+0

(&) 연산자가 있어야합니다. – Kimi

+0

왜 문제를 해결하지 않았습니까? – pmod

0

코드는 메모리를 할당에 충돌한다 : < : THT의 잘못은 무엇

free(i_param_st_p -> i_add_fields_st); 

?