当GDB调试核心文件时,是否可以将充满二进制数据的文件加载到GDB中?

2023-12-28

我正在使用 GDB 和核心文件调试崩溃。很大一部分内存空间被映射到进程中。这部分内存不会保存到核心文件中。我有一个文件,其中包含该映射内存中的所有数据。

我想找到一种方法将该文件中的数据加载到 GDB 的某个偏移量处,以便我可以在该地址空间内显示数据结构。这可能吗?

请注意,我已经尝试过 'restore' GDB 中的命令,但它仅在调试正在运行的进程时有效。

也许有一些工具允许核心文件附加附加数据?我正在尝试使用 objcopy 以查看是否可以使用此二进制数据来扩充核心文件,但我尚未成功。


我能够使其工作的唯一方法是修改核心文件本身,以具有包含新数据的附加程序头/部分。

理论上,我相信 objcopy 应该能够做到这一点,但经过大量测试后我无法让它工作。相反,我求助于编写一个修改核心文件的 perl 脚本。

对于遇到类似情况的人来说,这是一个脚本(请注意,这是针对 i386 架构上的 ELF 核心文件):


#!/usr/bin/perl

my @elfHeader = (
  [ident => 'A16'],
  [e_type => 'v'],
  [e_machine => 'v'],
  [e_version => 'V'],
  [e_entry => 'V'],
  [e_phoff => 'V'],
  [e_shoff => 'V'],
  [e_flags => 'V'],
  [e_ehsize => 'v'],
  [e_phentsize => 'v'],
  [e_phnum => 'v'],
  [e_shentsize => 'v'],
  [e_shnum => 'v'],
  [e_shstrndx => 'v']
);

my @progHeader = (
  [ptype => 'V'],
  [poffset => 'V'],
  [pvaddr => 'V'],
  [ppaddr => 'V'],
  [pfilesz => 'V'],
  [pmemsz => 'V'],
  [pflags => 'V'],
  [palign => 'V'],
);


my ($core, $dataFile, $outFile) = @ARGV;

main();


sub main {

  my @stat = stat($core);
  my $coreSize = $stat[7];

  @stat = stat($dataFile);
  my $dfSize = $stat[7];

  my ($in, $out, $df);
  open($in, "", $outFile) || die("Couldn't open $outFile: $!");

  my $buf;
  my $bytes = sysread($in, $buf, 52);

  my $hdr = unpackStruct(\@elfHeader, $buf);

  # Fix the elf header to have an additional program header
  my $phNum = $hdr->{e_phnum};
  $hdr->{e_phnum}++;

  # Fix the header to point to a new location for the program headers (at the end of the file)
  my $phOff = $hdr->{e_phoff};
  $hdr->{e_phoff} = $coreSize;

  # Read in the full program header table
  my $phTable;
  sysseek($in, $phOff, 0);
  my $readSize = $hdr->{e_phentsize} * $phNum;
  $bytes = sysread($in, $phTable, $readSize);

  # Add an additional entry to the end of the ph table
  my $entry = packStruct(\@progHeader, {ptype => 1, 
                                        poffset => $coreSize + $hdr->{e_phentsize} * $hdr->{e_phnum},
                                        pvaddr => 0x80f95000,
                                        ppaddr => 0,
                                        pfilesz => $dfSize,
                                        pmemsz => $dfSize,
                                        pflags => 7,
                                        palign => 4096});

  $phTable .= $entry;

  # Form the new elf header
  my $elf = packStruct(\@elfHeader, $hdr);

  # Output the new header
  syswrite($out, $elf, length($elf));

  # Copy the full core file after the header
  sysseek($in, 52, 0);
  copyData($in, $out, $coreSize - 52);

  # Output the new program table
  syswrite($out, $phTable, length($phTable));

  # Add the data on the end
  copyData($df, $out, $dfSize);

}


sub copyData {
  my ($in, $out, $numBytes) = @_;

  my $buf;

  while ($numBytes > 0) {
    my $readBytes = sysread($in, $buf, 8192);
    syswrite($out, $buf, $readBytes);
    $numBytes -= $readBytes;
  }

}


sub unpackStruct {
  my ($fields, $data) = @_;

  my $unpack;
  map {$unpack .= $_->[1]} @{$fields};

  my @vals = unpack($unpack, $data);

  my %res;
  foreach my $field (@{$fields}) {
    $res{$field->[0]} = shift(@vals);
  }

  return \%res;

}


sub packStruct {
  my ($fields, $data) = @_;

  my $pack;
  map {$pack .= $_->[1]} @{$fields};

  my @vals;
  foreach my $field (@{$fields}) {
    push(@vals, $data->{$field->[0]})
  }

  my $res = pack($pack, @vals);

  return $res;

}
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当GDB调试核心文件时,是否可以将充满二进制数据的文件加载到GDB中? 的相关文章

随机推荐

  • apt-get 错误:找不到“docker-ce”的版本“5:19.03.4~3-0~ubuntu-bionic”

    文档 https docs docker com install linux docker ce ubuntu 提供安装特定版本的语法docker ce sudo apt get install docker ce
  • 在 Linux 上为 Qt 应用程序获取 root 访问权限的正确方法

    Good day 背景 我正在为 Linux 系统创建一个 OpenVPN 包装应用程序 该应用程序已接近完成 我遇到了一个小障碍 OpenVPN 需要 root 访问权限才能修改路由表 添加和删除路由 这就是事情变得有点模糊和混乱的地方
  • Java语法解释-getMenuInflater()

    刚刚下载了 android studio 我正在使用大书呆子牧场 Android 编程指南来学习诀窍 当您启动 android studio 时 此代码已经在主活动文件中 Override public boolean onCreateOp
  • React 状态变量值显示为 null

    我正在尝试访问状态变量的值 但当我更改日期时它似乎为空 但如果我更改任何其他输入字段 我不会将其变为空 这里是link https stackblitz com edit react 6wbchf file src 2FApp js到 st
  • 如何在 J2ME 中分割字符串?

    如何在 J2ME 中有效地分割字符串 有一个StringTokenizer http download oracle com javase 1 4 2 docs api java util StringTokenizer html or S
  • 将 const char 转换为数组

    我正在尝试将 const char 转换为 char 这是我的代码 bool check const char word char temp 1 50 temp word return true 它是一个传入 const char 的函数
  • 为什么 ++i 不 || ++j && ++k 给出期望值

    我想知道为什么下面代码中k的值为1 I think i j k按照以下顺序执行 i j k 所以 在第一个片段中 i j i是真的 所以 j没有被评估 所以i 2 j 1 接下来 在第二个片段中 true k so k被评估 然后k 2 i
  • CUDA、cuPrintf 导致“未指定的启动失败”?

    我有一个内核 它以不同的网格大小运行两次 我的问题是 cuPrintf 当我没有的时候cudaPrintfInit 在内核运行之前和cudaPrintfDisplay stdout true and cudaPrintfEnd 内核运行后
  • RazorGenerator 无法看到自定义 cshtml 帮助程序

    我的 RazorGenerator 遇到问题 它无法编译使用我的自定义帮助程序的视图 App Code ViewHelper cshtml helper test System Web Mvc HtmlHelper html h4 Test
  • 单选按钮水平对齐

    如何使这两个单选按钮水平对齐 无论我如何尝试 它们都会保持垂直对齐或遍布各处 截至目前 它们是垂直对齐的 但我需要左侧的标签和右侧的转盘并靠近在一起 fieldset legend Payment Method legend div cla
  • Python Catboost:多类 F1 分数自定义指标

    如何找到多类 Catboost 分类器每个类的 F1 分数 我已经读过文档 https catboost ai docs concepts python reference catboostclassifier html和github 仓库
  • AngularJS 调用 REST 服务时回调如何工作?

    我正在学习 AngularJS 和 REST 代码示例使用这个词callback在认证功能中重复 回调 是 JavaScript 或 Angular 中的关键字吗 或者是callback只是在此代码中创建的自定义变量 如何callback在
  • 在 MVC2 中使用 FormsAuthenticationTicket cookie 自定义 IIdentity 和 IPrincipal

    我目前正在尝试在 ASP NET MVC2 Web 应用程序中实现一些自定义安全性 我正在尝试做一些非常简单的事情 如下面的代码所示 但由于某种原因 如果我使用 Authorize Roles Admins 我的控制器操作之一的属性 检查C
  • 同时构建许多类似的 Android .apk 文件?

    我有一个 Android 项目 我需要从中构建许多 apk apk 彼此之间仅在以下几个方面有所不同 Android 清单文件中有一些彼此不同的值 某些 apk 可能会排除 res 文件夹中的某些文件 不同的包名 自动构建所有这些不同的 a
  • 实体框架,代码优先。调用时子对象不会填充

    我首先要掌握 EF 代码 当我在代码中调用对象时 我的域模型设计似乎不支持自动 填充 对象的子对象 Model public class Car Key DatabaseGenerated DatabaseGeneratedOption I
  • 在 LINQ 中合并 2 个列表

    我有两个自定义对象列表 List1 Year Month ValueA List2 Year Month ValueB 我想要获得第三个列表 并将两者合并 List3 Year Month ValueA ValueB 在 LINQ VB N
  • CUDA/C - 在内核函数中使用 malloc 会产生奇怪的结果

    我是 CUDA C 的新手 也是堆栈溢出的新手 这是我的第一个问题 我试图在内核函数中动态分配内存 但结果出乎意料 我读到在内核中使用 malloc 会大大降低性能 但无论如何我都需要它 所以我首先尝试使用一个简单的int array 只是
  • React-bootstrap-typeahead labelKey 打字稿

    我有与埃里吉奥对此问题的回答中讨论的相同问题 但从未回答过 使用 Typescript 反应 AsyncTypeahead https stackoverflow com questions 56170309 react asynctype
  • 将 CSV 文件导入 SQL Server

    我正在寻求帮助以导入 csv使用以下命令将文件存入 SQL ServerBULK INSERT我有几个基本问 题 Issues CSV 文件数据可能有 逗号 之间 例如 描述 那么我怎样才能使导入处理这些数据呢 如果客户端从 Excel 创
  • 当GDB调试核心文件时,是否可以将充满二进制数据的文件加载到GDB中?

    我正在使用 GDB 和核心文件调试崩溃 很大一部分内存空间被映射到进程中 这部分内存不会保存到核心文件中 我有一个文件 其中包含该映射内存中的所有数据 我想找到一种方法将该文件中的数据加载到 GDB 的某个偏移量处 以便我可以在该地址空间内