【问题标题】:Programming / memory / logical issue in code代码中的编程/内存/逻辑问题
【发布时间】:2010-07-18 17:48:58
【问题描述】:

你能告诉我代码有什么问题吗,我的应用程序随机崩溃 我找不到任何可能的逻辑或内存错误,请帮忙,因为这超出了我的范围。

#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;
}

【问题讨论】:

  • 大多数编译器都会为您预定义一个带有函数名称的宏 - 通常是 __FUNCTION__ 或类似的名称。这至少可以避免你自己动手。
  • 你的调试器应该告诉你哪一行崩溃了,并给你一个回溯来找出你是如何到达那个状态的。到目前为止你做了什么?
  • 一个出口点写在上层,从那里我用它在下层创建我自己的代码。 pstack:ffffffff6e908e84 CGD9_gd_ParseAddFieldsProC (ffffffff427eecd8, 0, 1144963b0, 10e318c90, 1144963b0, ffffffff427ef098) + 13c
  • “objective-c”上的错误标签 - 这是直接的 C 世界和内存管理。

标签: c++ c memory-leaks memory-management


【解决方案1】:

在黑暗中拍摄:

你正在使用

memcpy(&p_ext_fields_s->rowid ...

但是

memset(p_ext_fields_s->rowid,...

所以应该是这样的

memset(&p_ext_fields_s->rowid,

相反?但如果这真的是问题所在,我希望它不会随机崩溃,而是每次都崩溃......

【讨论】:

  • 它每次都崩溃。但有时它运行 3 小时,有时只运行 2 分钟
【解决方案2】:

为什么在第一种情况下使用 sizeof(),而在第二种情况下使用常量大小 (18)?

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 我建议使用内存检查工具运行您的代码(因为我怀疑内存损坏)。

【讨论】:

  • 如果代码如下所示,我想确认查看上述帖子的一件事:memset(&p_ext_fields_s->rowid,'0',sizeof(p_buff[i_param_st_p->output_index].rowid)) ;
  • 尝试逐步排除行。当然,您会错过一些功能,但您将能够识别出失败的代码。例如flush(null)可以被丢弃,free()调用可以被丢弃(当然,这会是内存泄漏,但它可能有助于找到崩溃的原因)。
【解决方案3】:

代码崩溃以释放内存分配:

free(i_param_st_p -> i_add_fields_st); 

这有什么问题:

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 2011-04-16
    • 2020-10-31
    • 1970-01-01
    • 2023-02-16
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多