DTrace
在查找内存泄露这个令人头疼的问题方面是一个特别好的工具。这不,在前两天的FreeBSD
邮件列表里,又利用DTrace
解决了内存泄露的一个bug
。命令很简单:
# dtrace -n 'dtmalloc::CAM_CCB: {printf("%s", execname); stack();}'
通过stack()
就可以看到哪里进行了malloc
。Patch
如下:
diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c
index 85b2ff9..1f7be4f 100644
--- a/sys/cam/cam_periph.c
+++ b/sys/cam/cam_periph.c
@@ -1876,6 +1876,7 @@ cam_periph_devctl_notify(union ccb *ccb)
if (cgd->ccb_h.status == CAM_REQ_CMP)
sbuf_bcat(&sb, cgd->serial_num, cgd->serial_num_len);
+ xpt_free_ccb((union ccb *)cgd);
}
sbuf_printf(&sb, "\" ");
sbuf_printf(&sb, "cam_status=\"0x%x\" ", ccb->ccb_h.status);
在其它支持DTrace
的系统上,查找内存问题也可以参考上述DTrace
命令。
参考资料:
wired memory leak at r298785。