【问题标题】:How to know the hidden caller of a function in linux kernel statically如何静态知道linux内核中函数的隐藏调用者
【发布时间】:2014-07-29 16:12:51
【问题描述】:

我观察到 linux 中的许多函数没有直接调用者。可能它们可能是通过函数指针或其他方式调用的。 我正在静态分析 linux 内核代码是否存在内存泄漏。在那我遇到了许多释放分配对象的函数,但我无法弄清楚该函数的调用者。

例如 i915_gem_free_object() 释放 i915_gem_set_tiling 中分配的 drm_i915_gem_object 结构的(obj->bit_17) 对象() 函数。但是浏览代码我无法弄清楚是谁在调用 i915_gem_free_object() 函数。

有什么方法可以静态检查吗? 附言我正在使用 Linux 内核 3.12

【问题讨论】:

  • 我认为没有一种简单的方法可以通过函数指针静态跟踪函数调用。

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

i915_gem_free_object()是通过struct drm_driver调用的,我想你需要弄清楚驱动是如何调用这个函数的:

static struct drm_driver driver = {
  ...
    .gem_free_object = i915_gem_free_object,
  ...
}

【讨论】:

  • 对不起,我在我的问题中没有提到相同的内容(不是不必要的想拖动问题),是的,你是对的,但我无法弄清楚在哪里访问这个结构来调用相应的免费功能
  • 那应该是drm_gem.c。检查 gem_object_free() 的所有调用者,同时查看 drm_gem_object_free()。
【解决方案2】:

由于大多数内核是基于框架(子系统)的,特定框架(子系统)的特性是使用函数指针导出的,函数指针本质上是动态的。因此,您实际上无法“知道”函数是如何被调用的,但是您当然可以随时查看子系统的代码并找出函数指针被调用的位置。在你的情况下,它可能是这样的driver->gem_free_object(obj);,可能会根据情况从不同的地方调用。参考drivers/gpu/drm/drm_gem.c

您不妨使用dump_stack() 将堆栈跟踪打印到内核日志并找出调用者。

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多