2

我正在尝试实现一个函数来回溯内核中崩溃的用户空间进程。因为,我在 Kernel 工作,所以我没有任何库,并且提供的回溯功能不支持 MIPS 架构。我只是想知道我是否可以模仿 GDB 的功能。内核版本为 2.6.21。

4

2 回答 2

1

核心文件为ELF 格式。这是一个标准,在许多网站上都可以使用,只需 google 一下。

但是,这种文件格式并不简单。很多怪癖和小问题。任何理性的人都应该使用第三方库。如果您真的想这样做,请从 libelf 和 readelf 开始。并祝自己好运。

于 2009-06-27T01:18:32.383 回答
1

我认为您可以参考oprofile的实现。

Oprofile 使用 frame-pointer 来获取回溯信息,因此它需要用户空间应用程序及其相关库都启用了 frame-pointer。(“-fno-omit-frame-pointer”选项)。

另一种方法是,如果用户应用程序包含调试信息,您可能需要检查用户应用程序的DWARF信息,DWARF 调用帧信息为调试器提供了有关函数如何调用的足够信息,以便它可以定位到每个参数函数,定位当前调用帧,定位调用信息的调用帧。

如果您想在不支持“帧指针”或任何调试信息的情况下简单地抓取回溯信息,那么您必须检查用户应用程序的 mips 指令,遍历子上下文(SP、IP、RP)的内容以获取父上下文(SP,IP,RP) 由 mips ABI 规范,这有点复杂和耗时,因为你必须反汇编内存中的许多指令,但它的效果还不错。例如,对于很多例程来说,在乞讨的时候有一个类似“add sp,sp,-32”的指令,你就会知道parent的sp是当前sp加32。

第二种和第三种方式你必须自己实现它,因为你在内核中工作。

于 2009-06-27T03:02:43.530 回答