【问题标题】:Checking a process' stack usage in Linux在 Linux 中检查进程的堆栈使用情况
【发布时间】:2018-12-11 23:21:23
【问题描述】:

我使用的是 3.12.10 版的 Linux。我正在编写一个简单的模块,它遍历任务列表并检查每个进程的堆栈使用情况,以查看是否有任何堆栈溢出的危险。要获取我使用的进程的堆栈限制:

tsk->signal->rlim[ RLIMIT_STACK ].rlim_cur

要获取我使用的堆栈开头的内存地址:

tsk->mm->start_stack

然后我从中减去这个宏的结果:

KSTK_ESP( tsk )

大多数时候这似乎工作得很好,但有时我会遇到一个进程使用超过其堆栈限制(通常为 8 MB)的情况,但该进程继续运行并且 Linux 本身没有报告任何类型的问题。

我的问题是,我是否使用正确的变量来检查此堆栈使用情况?

【问题讨论】:

    标签: linux-kernel stack


    【解决方案1】:

    在做了更多研究之后,我想我已经意识到这不是确定使用了多少堆栈的好方法。当内核为该进程为堆栈分配更多内存页时,就会出现问题。这些页面可能与其他页面不连续。因此,当前堆栈指针可能是导致计算无效的某个值。

    task->mm->stack_vm 中的值可用于确定实际分配给进程堆栈的空间量。这个虽然没有实际使用多少准确,但是对于我的使用来说,已经足够好了。

    【讨论】:

    猜你喜欢
    • 2011-12-15
    • 2018-10-11
    • 2010-09-12
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2014-04-11
    相关资源
    最近更新 更多