在装有 Centos 5 的 64 位机器上使用带有 32 位二进制文​​件的 gdb 和 gdbserver 会抱怨内存访问或数据格式错误

2023-11-27

我有两台相同的 64 位 Centos 5 机器,它们已联网,并共享其 /home 安装。我在一台机器上编译了一个简单的 Hello World 程序,然后我弄清楚了如何在一台机器上使用 gdb 远程调试在另一台机器上运行的程序。当每个人都默认为 64 位时,这似乎工作得很好。

但是,如果我使用 -m32 编译 Hello World 以生成 32 位二进制文​​件(我们的完整系统的编译方式),那么我无法弄清楚如何让 gdb 和 gdbserver 正确连接。在我在完整的系统上尝试之前,我想我应该让它与 hello 一起工作。根据我尝试连接 gdb 和 gdbserver 的方式,我要么收到有关格式错误的寄存器的消息、有关体系结构不匹配的警告或非法内存引用。

我似乎不太了解 -m32 在我的编译中的含义,也不知道如何启动 gdb 和 gdbserver 或指定体系结构或文件或其他内容的正确顺序。 :(

在 64 位 Linux 机器上的 32 位(-m32)可执行文件上使用 gdb 和 gdbserver 需要什么?

下面的例子,谢谢,

Jerry

你好.cpp:

#include <iostream>
int main(int argc, char *argv[])
{
    std::cout << "Hello World." << std::endl;
    return -1;

}

以下是三个运行:

  1. 在 gdb 中,设置架构 i386 / 然后连接到 gdbserver => bad Architecture
  2. 在 gdb 中,设置架构 i386 / file hello / 然后连接到 gdbserver => bad Architecture
  3. 在gdb中,设置架构(错误)i386:x86-64 / file hello / 然后连接到gdbserver =>无法访问内存

或者更详细一点:

================================

对于每次运行,远程 gdbserver 都会说:


    $ gdbserver --multi rdev6:2010 hello
    Process hello created; pid = 32603
    Listening on port 2010
    Remote debugging from host 134.51.26.149
    readchar: Got EOF
    Remote side has terminated connection.  GDBserver will reopen the connection.
    Listening on port 2010

在我们本地:

================================

  • 假设是i386 32位,设置archi为i386,然后连接 注意:在 gdb 端,尚未指定或加载可执行文件

    $ gdb
    GNU gdb Fedora (6.8-37.el5)
    his GDB was configured as "x86_64-redhat-linux-gnu".
    (gdb) set archi i386
    The target architecture is assumed to be i386
    (gdb) target extended-remote rdev6:2010
    Remote debugging using rdev6:2010
    warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64
    Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
    here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
    Try to load the executable by `file' first,
    you may also check `set/show architecture'.
    (gdb)

================================

  • 假设是i386 32位,设置archi为i386,然后连接 注意:在 gdb 端,可执行文件已加载文件

    $ gdb
    GNU gdb Fedora (6.8-37.el5)
    his GDB was configured as "x86_64-redhat-linux-gnu".
    (gdb) set archi i386
    The target architecture is assumed to be i386
    (gdb) file hello
    Reading symbols from /home/j/hello...done.
    (gdb) target extended-remote rdev6:2010
    Remote debugging using rdev6:2010
    warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64
    Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
    here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
    Try to load the executable by `file' first,
    you may also check `set/show architecture'.
    (gdb) sho archi
    The target architecture is assumed to be i386
    (gdb)

================================

  • 假设(这应该是不正确的)它是 i386:x86-64,将 archi 设置为 i386:x86-64,然后连接 注意:在 gdb 端,可执行文件已加载文件

    $ gdb
    GNU gdb Fedora (6.8-37.el5)
    This GDB was configured as "x86_64-redhat-linux-gnu".
    (gdb) set archi i386:x86-64
    The target architecture is assumed to be i386:x86-64
    (gdb) file hello
    Reading symbols from /home/j/hello...done.
    (gdb) show archi
    The target architecture is assumed to be i386:x86-64
    (gdb) target extended-remote rdev6:2010
    Remote debugging using rdev6:2010
    [New Thread 32667]
    Cannot access memory at address 0x800000008
    (gdb)

如果要使用 64 位 gdb/gdbserver 调试 32 位进程,则需要更新版本的 GDB。特别是,你需要这个:

gdbserver/ChangeLog:

2009-05-12  Doug Evans  <[email protected]>

        Biarch support for i386/amd64 gdbserver.

或者,您可以通过运行以下命令来构建 32 位模式下已从源代码获得的 gdb/gdbserver

./configure CC='gcc -m32'

并使用 gdb32/gdbserver32 调试您的进程。不过,我没有看到这样做有任何好处——新版本的 GDB 有许多修复、加速,而且 STL 漂亮的打印机也很好。

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

在装有 Centos 5 的 64 位机器上使用带有 32 位二进制文​​件的 gdb 和 gdbserver 会抱怨内存访问或数据格式错误 的相关文章

  • fork 后调试子进程(配置了 follow-fork-mode 子进程)

    我正在开发一个应用程序 父级分叉子级来处理某些任务 我遇到一个问题 我已将 gdb 配置为 follow fork mode 子级 但在 fork 后 到达断点后 它发送 SIGTRAP 但子级以某种方式终止并向父级发送 SIGCHLD 我
  • 为什么 64 位 Delphi 应用程序计算的结果与 32 位构建不同?

    我们最近开始创建应用程序的 64 位版本 在比较测试中 我们发现 64 位版本的计算方式有所不同 我有一个代码示例 演示了两个版本之间的差异 var currPercent currGross currCalcValue Currency
  • 安装到 {sys} 的文件/DLL 未出现在 C:\Windows\system32 中

    我不知道为什么 但是当我尝试将文件从安装目录复制到system32 尽管在 Inno Setup 中显示安装成功 但它未能执行此操作 这是我的代码 Files specifies what files will be included in
  • Go:使用 gdb 打印变量

    在此程序中 如何使用调试器中断执行并打印 i 的值 package main import fmt func main x abc i 3 fmt Println i fmt Println x 我无法打印我 不过我可以打印 x go bu
  • 如何从 gdb 命令提示符执行外部命令?

    我正在使用 gdb 调试程序 每当我错过断点或决定添加另一个观察点时 我必须终止该进程并重新运行它 为了将现有的 gdb 附加到它 我使用attach
  • 有什么方法可以判断我的 iPhone 应用程序在运行时是否在调试器下运行?

    如果我的错误处理代码在调试器下运行 我希望它的行为有所不同 具体来说 如果我在手机上运行 未连接到调试器并且断言失败 我想将错误发送到我的服务器 当我在gdb下时 我想闯入调试器 虽然我可以想象苹果将如何编写代码 但我找不到任何关于测试调试
  • 以编程方式强制 Cocoa 应用程序以 32 位模式启动

    我有一个 Cocoa 应用程序 通常在任何支持此架构的 Mac 上以完整 64 位模式运行 现在我有一个外部 API 只能作为 32 位插件加载到主程序中 该 API 适用于第三方输入设备 只有一小部分用户会购买该设备 但这对于那一小部分用
  • 专门逐行调试

    我有一个用 Pascal 编写的脚本 我会以这种方式调试它 在每一行停止 转储内存中所有变量的值 然后转到下一行 是否可以使用 gdb 或其他 Linux 开源工具来完成此操作 使用选项编译文件 g fpc gpc g file pas R
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 测试是否定义了 gdb 便利变量

    有没有办法测试 gdb 中是否设置了便利变量 例如 gdb if exitcode 0 gt quit gt end Invalid type combination in equality test gdb p exitcode 1 vo
  • GDB/bin/bash 无法在 Eclipse CDT 中执行应用程序?

    在 Mac OS X Mojave 上使用 Eclipse CDT 运行 GDB 时遇到困难 当我尝试调试项目时 GDB 表现得很混乱 我能够调试几次 但随后它在下一个调试会话开始时开始停止 并显示消息 配置 GDB 可执行文件是 User
  • 哪个信号被传递到信号处理程序中死锁的进程

    我有一个来自调用信号处理程序后死锁的进程的核心转储 如何确定传送了哪个信号以及是谁发送的 GDB 为接收信号的线程生成的回溯如下 信号处理程序在第 15 帧中被调用 gdb bt 0 0x00007fa9c204654b in sys fu
  • 编译 32 位和 64 位时性能差异巨大(快 26 倍)

    我试图衡量使用的差异for and a foreach访问值类型和引用类型的列表时 我使用以下课程来进行分析 public static class Benchmarker public static void Profile string
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • “劣质调试器”一词中的“劣质”是什么意思?

    我不太明白GDB手册中对inferior的解释 谷歌也没有提供任何更有帮助的信息 谁能简单地解释一下 低等 劣质 是一个通用术语 表示 您正在使用 gdb 来调试的东西 通常是在模拟器或通过串行线路连接的其他硬件上运行的进程或内核 当您使用
  • gdb 错误 - 文件不是可执行格式:无法识别文件格式

    我正在尝试使用 gdb 调试某个名为 xdf 的程序 但是当我运行 gdb xdf 时 出现以下错误 home nealtitusthomas X ray astronomy heasoft 6 24 x86 64 pc linux gnu
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • GDB - 将地址映射到源代码中的行和列

    gcc 和 clang 都有选项 gcolumn info 描述如下 将位置列信息发出到 DWARF 调试信息中 而不仅仅是文件和行 我已经使用此选项编译了我的二进制文件 现在我有一些指令的地址 想将其翻译回源文件 行号和列 有没有办法在g

随机推荐

  • 如何在Linux上高效监控目录变化?

    我正在使用 Magento 有一个功能可以将 CSS 和 Javascript 合并到一个大文件中 不管其优点和缺点 都存在以下问题 最终文件会在多个级别进行缓存 包括但不限于 亚马逊云前 代理服务器 客户端浏览器缓存 Magento 使用
  • Aurelia 语义下拉菜单

    我正在尝试在 Aurelia 中使用组合框 以便我的用户可以输入下拉列表并搜索内容 我试图合并 Semantic 创建的下拉菜单 但是当我在元素上调用下拉菜单时 它不会运行代码 因此它仍然是一个正常的下拉菜单 就像这里的状态示例一样 htt
  • R 从面板中删除行,同时保持面板平衡

    有没有一种优雅的方法来平衡不平衡的面板数据集 我想从一个不平衡的面板 即 有些人丢失了一些数据 开始 最后得到一个平衡的面板 即 所有的人都没有丢失任何数据 下面是一些示例代码 正确的最终结果是保留对 Frank 和 Edward 的所有观
  • 如何从 Blazor 服务器端下载内存中文件

    有没有办法下载动态生成的文件在记忆中 in Blazor 服务器端不需要将其存储在文件系统上 解决方案是添加Web Api控制器到 Blazor 服务器端应用程序中 Add Controllers DownloadController cs
  • Android TabHost 上的徽章

    我想实现与 iPhone 中相同的功能 我在底部栏中实现了与 iPhone 中相同的自定义 Tabhost 我可以设置 正常 选定状态的两个图标 但我需要带有数量的动态图标 通知如图片所示 Thanks Android ViewBadger
  • 增强named_mutex和remove()命令

    我有一个可以由多个线程创建的类 但在一个函数中 代码需要受到保护 因此我决定使用 boost 进程间互斥体 每个类在其构造函数中创建或打开相同的互斥体 MyClass MyClass boost interprocess named mut
  • 对于布尔字段,其 getter/setter 的命名约定是什么?

    Eg boolean isCurrent false 你将它的 getter 和 setter 命名为什么 假设你有 boolean active 访问器方法是 public boolean isActive return this act
  • 依赖属性强制绑定问题

    我同时安装了 VS2008 和 VS2010 我看到一个非常奇怪的行为 在 VS2008 中 我有一个简单的 WPF 应用程序
  • 显示时未转换 Unicode

    我正在将应用程序本地化为西班牙语 并且使用 Unicode 在该语言的 Localized strings 文件中对字符进行编码 例如 我有以下条目 login saveSettings Guardar configuraci u00F3n
  • PHP 标头(位置:...):强制地址栏中的 URL 更改

    我目前正在开发一个移动网站 该网站使用 PHP 会话与数据库进行身份验证 我有一个登录页面 其中包含一个表单 可以转到服务器登录 php提交时 然后 php 文件创建一些会话数据 存储在 SESSION 中 并将用户重定向回索引页面 hea
  • 为什么 printf 在调用后不会刷新,除非格式字符串中有换行符?

    为什么printf除非格式字符串中有换行符 否则调用后不会刷新 这是 POSIX 行为吗 我怎么可能有printf每次都立即冲水 The stdout默认情况下 流是行缓冲的 因此只会在到达换行符 或被告知时 后显示缓冲区中的内容 您有几个
  • Flutter 如何将图像文件保存到图库中的新文件夹?

    我想在从相机获取文件后将图像保存在图库中 如何创建一个新目录并保存我们从相机获取的图像文件 Future getImageCamera async var imageFile await ImagePicker pickImage sour
  • 为什么 Clojure 对非法参数说“没有匹配方法”?

    Character isWhitespace 的正确用法包括 Character isWhitespace a gt false Character isWhitespace gt true 然而 我的第一次尝试是这样的 我发现这个错误令人
  • 为什么不能将 cout 与用户定义的 std::string 转换一起使用?

    这里我定义一个Date 并指定用户定义的转换 class Date private int day int month string dateStr public Date int day int month day day month m
  • 在 Typescript 中将一个对象映射到另一个对象

    我有一个角色对象 我想使用 PrimeNG 将其映射到 TreeNode 对象以将其显示在树中 角色对象是这样的 也如图所示 role id name description roles 树节点对象的结构如下 data label Docu
  • 有比 .NET Reflector 更好的东西吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我以前很喜欢 NET Re
  • 如何向 ActionBar 中的图标添加文本?

    是否可以定义与图标一起显示在 ActionBar 中的文本 这是文本还是只是图像 Use android showAsAction ifRoom withText 显示菜单标题和图标
  • 如何在 Yii 中的 Web 应用程序操作中调用控制台命令?

    我有一个控制台命令来执行消费者时间 并且我需要知道如何在 YII 中的 Web 应用程序操作中调用 执行 它 class MyCommand extends CConsoleCommand public function actionInd
  • 如何确定高斯滤波器的窗口大小

    高斯平滑是一种常见的图像处理函数 高斯滤波的介绍可以参考here 我们可以看到 一个参数 标准导数将决定高斯函数的形状 然而 当我们用高斯滤波进行卷积时 还需要同时确定另一个参数 高斯滤波器的窗口大小 例如 当我们使用fspecialMAT
  • 在装有 Centos 5 的 64 位机器上使用带有 32 位二进制文​​件的 gdb 和 gdbserver 会抱怨内存访问或数据格式错误

    我有两台相同的 64 位 Centos 5 机器 它们已联网 并共享其 home 安装 我在一台机器上编译了一个简单的 Hello World 程序 然后我弄清楚了如何在一台机器上使用 gdb 远程调试在另一台机器上运行的程序 当每个人都默