Debugging 核心文件是否有通用格式?

Debugging 核心文件是否有通用格式?,debugging,gdb,core,Debugging,Gdb,Core,我已经注意到,无论我使用哪种编译器(gcc、llvm、clang、icc等),如果我得到一个内核转储,我几乎总是可以将它扔进GDB(或者可能是其他调试器,但大多数时候我会本能地使用GDB),而不必担心程序/库是如何编译的。为什么会这样?是否有一种通用格式来描述如何创建核心转储?是否有任何编译器/调试器组合不遵循此格式?核心转储文件由操作系统内核编写,而不是由编译器或调试器编写。这就是为什么,例如,每个Linux调试器都支持相同的格式 Linux核心转储使用ELF格式。内核端的实现在中 然而,也有

我已经注意到,无论我使用哪种编译器(gcc、llvm、clang、icc等),如果我得到一个内核转储,我几乎总是可以将它扔进GDB(或者可能是其他调试器,但大多数时候我会本能地使用GDB),而不必担心程序/库是如何编译的。为什么会这样?是否有一种通用格式来描述如何创建核心转储?是否有任何编译器/调试器组合不遵循此格式?

核心转储文件由操作系统内核编写,而不是由编译器或调试器编写。这就是为什么,例如,每个Linux调试器都支持相同的格式

Linux核心转储使用ELF格式。内核端的实现在中


然而,也有类似的崩溃报告系统为远程收集写出自己的核心转储等价物。这些转储要小得多,只能包含堆栈跟踪地址列表,并在不同的操作系统中使用它们自己的自定义格式。不过,您需要在应用程序中显式地将它们集成为库。

核心转储格式特定于每个操作系统默认格式,最常见的格式是ELF

用户空间核心文件有许多段/程序头

在核心文件中转储两种类型的程序/段头

  • 票据
  • PT_负载
PT_音符段由一个或多个Elf_音符条目组成

程序头中的PT_LOAD条目描述进程的VMA(虚拟内存区域)

Linux和FreeBSD都将有关进程的大部分数据存储在PT_NOTE段中

在FreeBSD上,您可以从核心文件中读取注释段,如下所示

$ readelf --notes hello.core | grep -v "description data:"

Displaying notes found at file offset 0x00000200 with length 0x00001d04:
  Owner                 Data size       Description
  FreeBSD              0x00000078       NT_PRPSINFO (prpsinfo structure)
  FreeBSD              0x000000e0       NT_PRSTATUS (prstatus structure)
  FreeBSD              0x00000200       NT_FPREGSET (floating point registers)
  FreeBSD              0x00000018       NT_THRMISC (thrmisc structure)
  FreeBSD              0x00000444       NT_PROCSTAT_PROC (proc data)
  FreeBSD              0x00000aec       NT_PROCSTAT_FILES (files data)
  FreeBSD              0x00000724       NT_PROCSTAT_VMMAP (vmmap data)
  FreeBSD              0x00000038       NT_PROCSTAT_GROUPS (groups data)
  FreeBSD              0x00000006       NT_PROCSTAT_UMASK (umask data)
  FreeBSD              0x000000d4       NT_PROCSTAT_RLIMIT (rlimit data)
  FreeBSD              0x00000008       NT_PROCSTAT_OSREL (osreldate data)
  FreeBSD              0x0000000c       NT_PROCSTAT_PSSTRINGS (ps_strings data)
  FreeBSD              0x00000114       NT_PROCSTAT_AUXV (auxv data)

NT_PRPSINFO - "struct prpsinfo" is dumped
NT_PRSTATUS - "struct prstatus" & "struct __reg64" is dumped
NT_FPREGSET - "struct __fpreg64" is dumped
NT_THRMISC  - "struct thrmisc" is dumped 
NT_PROCSTAT_* - Refer this for proc stat data see libprocstat
下面的文章详细介绍了FreeBSD支持的核心转储