我有kcore,我想从kcore获得用户空间回溯。因为我们的应用程序中的一些正在制作很多munmap并使系统挂起(CPU软锁定22s!)。我看了一些macro,但这只是给我内核回溯。我想要的是用户空间回溯。
好消息是我有指向task_struct的指针。
xcache
我的问题是如何从kcore或task_struct获取用户空间回溯。
答案 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,它将理解如何检索用户空间上下文