程序遇到malloc偶尔会挂掉(20%概率挂),求大神指点!

smart_king 2013-06-05 09:39:54
编译模块生成了一个upnpd进程,导入到盒子中,当盒子收到Ip change的消息时,upnpd会重新启动,一般都能成功,偶尔会挂掉,跟踪日志,发现挂在malloc上,就是说进程遇到malloc就直接挂掉,下面也对申请的指针做了非空判断,没有提醒申请的指针为空;

printf("--%s--%d--\n ",__FUNCTION__,__LINE__);
pNewVirtualDir = virtualDirList * ) malloc( sizeof( virtualDirList ) );
printf("--%s--%d--\n ",__FUNCTION__,__LINE__);
if( pNewVirtualDir == NULL ) {
printf("--%s--%d--\n ",__FUNCTION__,__LINE__);
return UPNP_E_OUTOF_MEMORY;
}

每次都是第一个printf能打印出来,第二个就打印不出来,求大神指点;
...全文
417 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
smart_king 2013-06-05
  • 打赏
  • 举报
回复
引用 7 楼 starytx 的回复:
[quote=引用 6 楼 smart_king 的回复:] [quote=引用 2 楼 starytx 的回复:] 检查一下这个 sizeof( virtualDirList ),看看大小是多少?你贴的代码无法看出什么原因
这个大小,我改为一个具体数据,也是偶尔挂掉,说名不是这个的问题,前面我也遇到过一个malloc挂掉的问题,我用一个全局标量替代malloc,但这次malloc无法规避,应为这个函数是为链表新增节点申请空间,还要把这个节点加入到链表中,这个操作是要反复进行的。[/quote]你如果确认是malloc的问题,可以检查一下返回的指针是不是NULL,再做处理[/quote] 返回的指针是不是NULL?可以看看我最开始贴出来的代码,malloc下面的打印没出来,程序就挂在malloc这句上,根本无法看出malloc失败没
starytx 2013-06-05
  • 打赏
  • 举报
回复
引用 6 楼 smart_king 的回复:
[quote=引用 2 楼 starytx 的回复:] 检查一下这个 sizeof( virtualDirList ),看看大小是多少?你贴的代码无法看出什么原因
这个大小,我改为一个具体数据,也是偶尔挂掉,说名不是这个的问题,前面我也遇到过一个malloc挂掉的问题,我用一个全局标量替代malloc,但这次malloc无法规避,应为这个函数是为链表新增节点申请空间,还要把这个节点加入到链表中,这个操作是要反复进行的。[/quote]你如果确认是malloc的问题,可以检查一下返回的指针是不是NULL,再做处理
smart_king 2013-06-05
  • 打赏
  • 举报
回复
引用 2 楼 starytx 的回复:
检查一下这个 sizeof( virtualDirList ),看看大小是多少?你贴的代码无法看出什么原因
这个大小,我改为一个具体数据,也是偶尔挂掉,说名不是这个的问题,前面我也遇到过一个malloc挂掉的问题,我用一个全局标量替代malloc,但这次malloc无法规避,应为这个函数是为链表新增节点申请空间,还要把这个节点加入到链表中,这个操作是要反复进行的。
酱油党 2013-06-05
  • 打赏
  • 举报
回复
查查 野指针 和 越界。。。不过估计会是个很恶心的东东
guochanoo7 2013-06-05
  • 打赏
  • 举报
回复
你有没有检查挂到链表上有没有出问题,你说的重启意思是什么,涉及到什么操作,你为什么这么确定是malloc出错了呢
smart_king 2013-06-05
  • 打赏
  • 举报
回复
引用 1 楼 guochanoo7 的回复:
你就贴了这么一点代码,不好看~~,话说你这个东西是干什么的
这个就是函数就是建立一个节点,并把此节点加入到链表中,程序挂在malloc上。
starytx 2013-06-05
  • 打赏
  • 举报
回复
检查一下这个 sizeof( virtualDirList ),看看大小是多少?你贴的代码无法看出什么原因
guochanoo7 2013-06-05
  • 打赏
  • 举报
回复
你就贴了这么一点代码,不好看~~,话说你这个东西是干什么的
pbdwadr 2013-06-05
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
Saleayas 2013-06-05
  • 打赏
  • 举报
回复
我觉得是在已经操作的过程中毁坏了堆,结果导致 malloc 错误。 看看有没有这样的操作。 而且这个操作就在上次成功 Alloc 之后。
Ericz 2013-06-05
  • 打赏
  • 举报
回复
printf 函数不要用__FUNC__,__LINE__这两个宏试试。应该能好
chongzipy 2013-06-05
  • 打赏
  • 举报
回复
注意 virtualDirList 是结构体的话有没有自然边界对齐,某些环境下不对齐可能会导致malloc挂。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧