如何在Linux内核中找到信号处理程序定义?

时间:2011-04-09 06:47:21

标签: c linux linux-kernel coredump

我正在研究"Creation of Postmortem data logger in Linux on Intel architecture"。  它只不过是核心效用创造。 任何机构都可以共享有关各种信号(SIGSEGV,SIGABRT,SIGFPE etc)的信号处理程序的详细信息,这些信号在Linux内核中实现内部崩溃时会产生core dump。我需要根据自己的用户特定需求重新编写这些信号处理程序并重建内核。它使我的内核生成核心文件(在崩溃应用程序时),具有用户特定需求,如显示registers,stackdump and backtrace etc

任何人都可以分享有关它的细节.... 感谢所有的回复者:)

3 个答案:

答案 0 :(得分:2)

您可能根本不需要修改内核 - 内核支持在发生核心转储时调用用户空间应用程序。来自core(5) man page

  

从内核2.6.19开始,Linux支持   替代语法   /proc/sys/kernel/core_pattern个文件。   如果此文件的第一个字符是   管道符号(|),然后是   该行的其余部分被解释   作为要执行的程序。代替   写入磁盘文件,   核心转储作为标准输入   该计划。

答案 1 :(得分:1)

实际的转储代码取决于转储的格式。对于ELF格式,请查看fs/binfmt_elf.c文件。我有elf_dump_core功能。 (与其他格式相同。)

这由get_signal_to_deliver kernel/signal.c触发,do_coredump调用fs/exec.c {{1}},调用处理程序。

答案 2 :(得分:1)

LXR, the Linux Cross-Reference,当您想知道Linux内核中的内容是如何完成时,通常会有所帮助。它是内核源代码的浏览和搜索工具。

搜索“核心转储”会返回大量点击,但最有希望看到的两个点击fs/exec.cfs/proc/kcore.c(很有希望因为文件名相当通用,特别是你不喜欢我想从特定于架构的东西开始)。 kcore.c实际上是用于内核核心转储,但fs/exec.c中的命中位于函数do_coredump中,这是转储进程核心的主要功能。从那里,您既可以阅读该功能,也可以查看它的作用,并搜索以查看它的调用位置。

do_coredump中的大多数代码都是关于确定是否转储核心以及转储的位置。在最后附近处理转储的内容:binfmt->core_dump(&cprm),即这取决于可执行格式(ELF,a.out,...)。所以你的下一个搜索是在core_dump struct字段,特别是它的“用法”;然后选择对应于可执行格式的匹配。 ELF可能是您想要的,因此您可以使用elf_core_dump函数。

话虽如此,我不相信你对你的目标的描述,你想要的是真正改变核心转储格式,而不是编写一个分析现有转储的工具。

您可能对existing work on analyzing kernel crash dumps感兴趣。其中一些工作也与流程转储相关,例如gcore extension to include process dumps in kernel crash dumps