gdb - 核心转储注释部分

标签 gdb elf coredump

关注我关于 manually generating a core dump file 的问题,我决定潜入它并弄脏我的手。

我能够构建基本的核心转储结构,并将死程序的内存恢复到大 LOAD 部分内的核心转储中。在 GDB 中调试时,我的变量又回来了,没问题。
棘手的部分来了,我如何让 GDB 检索有关程序崩溃时所在位置的信息。

我知道核心转储的注释部分包含此信息(cpu 寄存器等)。这是 objdump -h 为“真实”核心转储提供的内容:

core.28339:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 note0         000001e8  00000000  00000000  000000f4  2**0
                  CONTENTS, READONLY
  1 .reg/28339    00000044  00000000  00000000  00000150  2**2
                  CONTENTS
  2 .reg          00000044  00000000  00000000  00000150  2**2
              CONTENTS
  3 .auxv         000000a0  00000000  00000000  0000023c  2**2
              CONTENTS
  4 load1a        00001000  08010000  00000000  00001000  2**12
              CONTENTS, ALLOC, LOAD, READONLY, CODE
  .. other load sections ...

感谢 readelf,我发现那些 .reg 部分包含从某些结构映射的数据:
Notes at offset 0x000000f4 with length 0x000001e8:
  Owner     Data size   Description
  CORE      0x00000090  NT_PRSTATUS (prstatus structure)
  CORE      0x0000007c  NT_PRPSINFO (prpsinfo structure)
  CORE      0x000000a0  NT_AUXV (auxiliary vector)

有人可以指导我如何构建 Notes 部分吗?
我尝试将这些结构直接写入我的文件,但没有用,而且我显然在这里遗漏了一些东西。
我看了Google Coredumper code并取了一些,但写注释部分并不是那么简单,欢迎任何关于它确切包含的内容及其格式的详细信息。

编辑 #1:遵循第一条评论

我发现我的 Elf 文件的结构如下:
  • Sprite 头 ElfW(Ehdr)
  • 程序头文件(Ehdr.e_phnum 乘以 ElfW(Phdr)),这里我基本上用了一个 PT_NOTE 和一个 PT_LOAD 头文件
  • 注意部分:
  • 部分的标题 (ElfW(Nhdr))
  • 部分名称(.n_namesz 长)
  • 节的数据(.n_descsz long)
  • 包含我所有程序内存的程序部分

  • 然后我将不得不放置 3 个笔记记录,一个用于 prstatus,一个用于 prpsinfo,另一个用于辅助向量。

    这似乎是正确的方法,因为 readelf 为我提供了与上面使用真实核心转储得到的输出类似的输出。

    编辑 #2 :获得正确的结构后

    我现在正在为组成笔记记录的不同结构而苦苦挣扎。

    这是我在核心转储上运行 eu-readelf --notes 时得到的结果:
    Note segment of 540 bytes at offset 0x74:
      Owner          Data size  Type
      CORE                 336  PRSTATUS
      CORE                 136  PRPSINFO
      CORE                   8  AUXV
        NULL
    

    这是我在真实核心转储上运行相同命令时得到的结果:
    Note segment of 488 bytes at offset 0xf4:
      Owner          Data size  Type
      CORE                 144  PRSTATUS
        info.si_signo: 11, info.si_code: 0, info.si_errno: 0, cursig: 11
        sigpend: <>
        sighold: <>
        pid: 28339, ppid: 41446, pgrp: 28339, sid: 41446
        utime: 0.000000, stime: 0.000000, cutime: 0.000000, cstime: 0.000000
        orig_eax: -1, fpvalid: 0
        ebx:             -1  ecx:              0  edx:              0
        esi:              0  edi:              0  ebp:     0xffb9fcbc
        eax:             -1  eip:     0x08014b26  eflags:  0x00010286
        esp:     0xffb9fcb4
        ds: 0x002b  es: 0x002b  fs: 0x0000  gs: 0x0000  cs: 0x0023  ss: 0x002b
      CORE                 124  PRPSINFO
        state: 0, sname: R, zomb: 0, nice: 0, flag: 0x00400400
        uid: 9432, gid: 6246, pid: 28339, ppid: 41446, pgrp: 28339, sid: 41446
        fname: pikeos_app, psargs: ./pikeos_app 
      CORE                 160  AUXV
        SYSINFO: 0xf7768420
        SYSINFO_EHDR: 0xf7768000
        HWCAP: 0xbfebfbff  <fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe>
        PAGESZ: 4096
        CLKTCK: 100
        PHDR: 0x8010034
        PHENT: 32
        PHNUM: 2
        BASE: 0
        FLAGS: 0
        ENTRY: 0x80100be
        UID: 9432
        EUID: 9432
        GID: 6246
        EGID: 6246
        SECURE: 0
        RANDOM: 0xffb9ffab
        EXECFN: 0xffba1feb
        PLATFORM: 0xffb9ffbb
        NULL
    

    有人对为什么我的笔记记录无法正确阅读有任何线索或解释吗?
    我认为这可能是由于偏移量不正确,但是为什么会正确列出记录?

    谢谢 !

    最佳答案

    前段时间在我将 CRIU 图像转换为核心转储的项目中遇到了同样的麻烦。它完全是用python编写的(即使 Sprite 结构也在ctypes中),因此可以用作指南。见 https://github.com/efiop/criu-coredump 。IE。在这里可以看到一切的结构https://github.com/efiop/criu-coredump/blob/master/criu_coredump/core_dump.py .

    关于gdb - 核心转储注释部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17972945/

    相关文章:

    gcc - 取消链接 ELF 可执行文件

    c - 写入共享内存核心转储段错误

    c++ - 如何在 C++ 头文件上使用 gdb?

    c - 如何在mac m1(苹果硅)上安装GDB?

    linux - 在 ELF 文件中搜索 .init 部分

    nginx - 段错误(核心转储)

    linux - 核心转储本身是否可执行?

    debugging - 如何在不停止运行程序的情况下关闭gdb连接

    c - GDB-remote + qemu 报告静态 C 变量的意外内存地址

    c - 如何从 C 程序内部或使用内联汇编获取 C 函数的大小?