从task_struct获取用户stackpointer

时间:2015-11-03 17:42:31

标签: linux-kernel operating-system scheduled-tasks core process-management

我有kcore,我想从kcore获得用户空间回溯。因为我们的应用程序中的一些正在制作很多munmap并使系统挂起(CPU软锁定22s!)。我看了一些macro,但这只是给我内核回溯。我想要的是用户空间回溯。

好消息是我有指向task_struct的指针。

xcache

我的问题是如何从kcore或task_struct获取用户空间回溯。

2 个答案:

答案 0 :(得分:0)

首先,vmcores通常不包含用户页面。我不知道任何有用的魔法 - 你必须检查给定任务地址空间的vm映射然后检查物理页面,我高度怀疑调试器知道如何做。

但最重要的是,你可能没有任何正当理由去做。

那么,你想要实现什么目标?

=======================

鉴于编辑:

  

我们的应用程序中的一个正在制作大量的munmap并制作   系统挂起(CPU软锁定22s!)。

可能有也可能没有必须调试的实际内核问题。我认为这个用户空间栈跟踪没有任何用处。

因此我理解假设的问题是来自应用程序的过多mmap + munmap调用。检查用所述锁定报告的线程的回溯可能会或可能不会发生,以捕获罪魁祸首。你真正想要的是收集/所有/呼叫者的回溯并按频率对它们进行排序。使用systemtap可以做到这一点(虽然有痛苦)。

答案 1 :(得分:0)

首先,vmcore是一个即时的完整内存快照,因此它包含所有页面(包括用户页面)。但是,如果用户页面换出,则无法访问它们。这就是为什么kdump(和你的gdb python脚本类似的工具)只专注于内核调试功能。对于用户空间调试和堆栈跟踪,您必须使用coredump功能。默认情况下,当内核将(例如)SIGSEGV发送到您的应用程序时会产生coredump,但您可以通过使用gcore修改内核来制作它们。还有一个"用户空间"制作流程转储的方式,请参阅google coredumper项目

此外,您可以尝试直接从kcore中展开用户堆栈跟踪 - 但这是一种棘手的方式,您将不得不希望用户空间堆栈跟踪目前不会被换出。 (你使用交换?)你可以看到__save_stack_trace_user,它将理解如何检索用户空间上下文