免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4158 | 回复: 4
打印 上一主题 下一主题

请教高手一个问题 ptmalloc_lock_all陷入死循环 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-09 22:45 |只看该作者 |倒序浏览
做嵌入式开发,里面使用了大量的system调用。经常出现CPU很高,达到90%多,后来通过GDB跟踪栈
发现调到ptmalloc_lock_all就一直出不来。根据网上查找的资料:
bash uses its own malloc implementation. Because of that, ptmalloc_init()
is never called in bash, and the malloc internal variables like main_arena
stay uninitialized. In particular, main_arena.next is a null pointer.

Now, bash calls fork(), which runs the fork prepare handlers in the Hurd,
among them ptmalloc_lock_all. The implementation of that crashes if
main_arena.next is a null pointer, because the for loop doesn't terminate

大致的意思是说一旦main_arena.next 是空指针,循环就永不停止,查看了glibc代码,有个for循环一直找地址,没找到就不退出。

我们这个工程很庞大,想不用system几乎不可能,有没有其他什么解决方法,谢谢大家!

论坛徽章:
0
2 [报告]
发表于 2010-07-09 23:49 |只看该作者
本帖最后由 没本 于 2010-07-10 00:33 编辑

system发起者的内存脚印(footprint)太大,每次system会按footprint复制一份地址空间(fork的原理),哪怕你只是ls几个文件。因此要用system由一个很小的进程来发起,大进程想system时通过IPC机制通知那个小进程就发起system就行了。

论坛徽章:
0
3 [报告]
发表于 2010-07-10 17:14 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2010-07-12 10:06 |只看该作者
我们运行的进程确实很大,但我们都是克隆个小进程来调用system的。

这和单独的小进程应该没有区别。

另外目前我们的必现手段时2分钟就重启一下设备,重启设备的时候会调用到system去启动其他模块。

谁能解释一下2分钟时间的影响。

论坛徽章:
0
5 [报告]
发表于 2011-04-18 10:21 |只看该作者
请问这个问题解决了吗?
我也碰到同样的问题,原因是malloc/free与fork/system在不同的线程里,同时调用导致的。
在uclibc上有类似问题,表现不一样,有个补丁可以解决这个问题,不知道glibc怎么办。
如果解决的话,请楼主给个解决办法吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP