首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复libudev内存泄漏?

如何修复libudev内存泄漏?
EN

Stack Overflow用户
提问于 2018-02-02 00:04:58
回答 1查看 300关注 0票数 4

我正在为hidraw驱动下的USB设备实现一个基于libudev的监控代码。我已经实现了来自web的标准示例,并使用valgrind和gdb检查了内存泄漏。

代码语言:javascript
复制
/*******************************************
 libudev example.

 This example prints out properties of
 each of the hidraw devices. It then
 creates a monitor which will report when
 hidraw devices are connected or removed
 from the system.

 This code is meant to be a teaching
 resource. It can be used for anyone for
 any reason, including embedding into
 a commercial product.

 The document describing this file, and
 updated versions can be found at:
    http://www.signal11.us/oss/udev/

 Alan Ott
 Signal 11 Software
 2010-05-22 - Initial Revision
 2010-05-27 - Monitoring initializaion
              moved to before enumeration.
*******************************************/

我很不高兴地发现一些不应该分配内存的libudev函数正在泄漏。我通过在不同的点上退出(在所有对象都被取消引用之后)并查看valgrind报告来跟踪这一点。具体地说,此代码泄漏:

代码语言:javascript
复制
int main (void)
{
struct udev *udev;
struct udev_enumerate *enumerate;
struct udev_list_entry *devices, *dev_list_entry;
struct udev_device *dev, *devParent;
struct udev_monitor *mon;
int fd;

/* Create the udev object */
udev = udev_new();
if (!udev) 
{
    printf("Can't create udev\n");
    exit(1);
}
/* This section sets up a monitor which will report events when
    blah blah....
   "hidraw" devices. */

/* Set up a monitor to monitor hidraw devices */
mon = udev_monitor_new_from_netlink(udev, "udev");
udev_monitor_filter_add_match_subsystem_devtype(mon, "hidraw", NULL);
udev_monitor_enable_receiving(mon);
/* Get the file descriptor (fd) for the monitor.
   This fd will get passed to select() */
fd = udev_monitor_get_fd(mon);

/* Create a list of the devices in the 'hidraw' subsystem. */
enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, "hidraw");
if (1)
{
    // leak debug block
    udev_enumerate_unref(enumerate);
    udev_monitor_unref(mon);
    udev_unref(udev);
    return 0;
}
udev_enumerate_scan_devices(enumerate);
devices = udev_enumerate_get_list_entry(enumerate);
/* For each item enumerated, print out its information.

下面是valgrind的输出:

代码语言:javascript
复制
==11424== HEAP SUMMARY:
==11424==     in use at exit: 4,096 bytes in 1 blocks
==11424==   total heap usage: 11 allocs, 10 frees, 28,086 bytes allocated
==11424== 
==11424== LEAK SUMMARY:
==11424==    definitely lost: 0 bytes in 0 blocks
==11424==    indirectly lost: 0 bytes in 0 blocks
==11424==      possibly lost: 0 bytes in 0 blocks
==11424==    still reachable: 4,096 bytes in 1 blocks
==11424==         suppressed: 0 bytes in 0 blocks
==11424== Rerun with --leak-check=full to see details of leaked memory

如果我把“leaked block”放在上面的位置前面一行,valgrind就会退出,结果是0字节泄漏。如果我将代码块向前推进一行,下一个函数会增加泄漏大小和组件:

代码语言:javascript
复制
==14262==     in use at exit: 8,192 bytes in 2 blocks
==14262==   total heap usage: 45 allocs, 43 frees, 150,907 bytes allocated
==14262== 
==14262== LEAK SUMMARY:
==14262==    definitely lost: 0 bytes in 0 blocks
==14262==    indirectly lost: 0 bytes in 0 blocks
==14262==      possibly lost: 0 bytes in 0 blocks
==14262==    still reachable: 8,192 bytes in 2 blocks
==14262==         suppressed: 0 bytes in 0 blocks
==14262== Rerun with --leak-check=full to see details of leaked memory

它在下一行之后变得更糟,这是值得关注的,因为我的代码需要运行数年,这样的泄漏可以不加检查地累积。

有什么建议吗?为什么会发生这种情况,以及如何控制它?

EN

回答 1

Stack Overflow用户

发布于 2018-02-04 18:57:01

根据valgrind的报告,这些与哈希表相关的内存泄漏似乎不是一个问题,请参阅https://bugzilla.redhat.com/show_bug.cgi?id=1280334上的https://github.com/libratbag/libratbag/issues/405讨论和相关的report bug报告。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48566999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档