是否可以使用gdb和qemu同时调试linux用户空间程序和内核空间?

2023-11-23

到目前为止,使用 gdb + qemu,我可以单步执行 Linux 内核源代码。是否可以同时调试用户空间程序?例如,将程序从用户空间单步执行到内核空间,这样我就可以通过发出以下命令来观察 qemu 监视器上寄存器的变化info registers?


最少的分步设置

马胡克是对的,但这里有一个全自动 QEMU + Buildroot 示例这假设你已经知道如何使用 QEMU + gdb 调试内核以及更详细的解释:

readelf -h myexecutable | grep Entry

Gives:

  Entry point address:               0x4003a0

所以在GDB内部我们需要做:

add-symbol-file myexecutable 0x4003a0
b main

然后才在 QEMU 中启动可执行文件:

myexecutable

更可靠的方法是设置myexecutable as the init如果你能做到的话,请进行处理。

add-symbol-file还提到:如何在gdb中加载多个符号文件

为什么你会想要这样做而不是gdbserver?

到目前为止我只能看到一个用例:调试init: 使用 gdb 在 Qemu 上调试 init

否则,为什么不直接使用以下更可靠的方法,例如进入系统调用:

  • start two remote GDBs:
    • 一个与qemu-system-* -s
    • 另一个gdbserver myexecutable解释如下:https://reverseengineering.stackexchange.com/questions/8829/cross-debugging-for-mips-elf-with-qemu-toolchain/16214#16214
  • step in gdbserver的GDB尽可能接近系统调用,这通常意味着单步进入libc
  • 在 QEMU 的 GDB 上,执行例如b sys_read对于读系统调用
  • back on gdbserver, do continue

我提出这个建议是因为:

  • 当内核上下文切换到另一个使用相同虚拟地址的进程时,将 QEMU GDB 用于用户区可能会导致随机跳转

  • 如果没有,我无法正确加载共享库gdbserver: 尝试sharedlibrary直接给出:

    (gdb) sharedlibrary ../../staging/lib/libc.so.0
    No loaded shared libraries match the pattern `../../staging/lib/libc.so.0'.
    

    因此,由于大多数内核交互都通过 stdib,因此您需要执行大量智能汇编步骤来查找内核条目,这可能不切实际。

    也就是说,直到有人编写了更智能的 GDB 脚本,该脚本会逐步执行每条指令,直到发生上下文切换或直到源可用为止。我想知道这样的脚本是否会太慢,因为简单的方法会产生每条指令与 GDB 之间通信的开销。

    这可能会帮助您开始:告诉 gdb 跳过标准文件

解析Linux内核数据结构

为了正确地进行用户态进程调试,这就是我们最终要做的:Linux 内核的线程感知 gdb

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

是否可以使用gdb和qemu同时调试linux用户空间程序和内核空间? 的相关文章

  • Roslyn 脚本:运行时异常的行号信息

    我正在摆弄 Roslyn 脚本的东西 使用Microsoft CodeAnalysis CSharp Scriptingnuget 包 我想知道是否有一种方法可以将行号信息添加到堆栈跟踪中 以了解脚本内发生的异常 当我运行以下 C 代码时
  • 专门逐行调试

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

    在 GDB 中 给定一个指向结构体的变量 print将显示原始指针值并x将显示指向的原始字节 有什么方法可以显示指向该结构的数据 即字段及其值的列表 print variable 如果这样做 它将在 GDB 中显示该变量的值 您还可以选择显
  • 开始调试和附加到进程有什么区别

    当我将项目附加到我的 w3wp exe IIS 工作进程时 我的项目加载速度明显快于 开始调试 时的加载速度 但是 无论我 开始调试 还是 附加到进程 同一个工作进程似乎都在处理相同数量的模块 DLL w3wp exe 为什么附加到进程的速
  • 使用 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
  • 如何编写需要内核源头文件的 BitBake 驱动程序配方?

    介绍 我有一个do install我为驱动程序编写的 BitBake 配方中的任务 我在其中执行自定义install脚本 任务失败 因为安装脚本无法在其中找到内核源头文件
  • Visual Studio 代码调试器未连接到 SAM 本地

    根据 AWS 文档 我将像这样启动本地 SAM sam local start api d 5858 我的 launch json 中有以下内容 version 0 2 0 configurations name Attach to SAM
  • 如何调试没有错误消息的错误?

    如何调试没有错误消息的错误 当加载 PHP 页面时 我在 Firefox 中收到此错误 The connection to the server was reset while the page was loading 除了看起来是 Apa
  • 如何在 Rust 中使用 cfg 检查发布/调试版本?

    使用 C 预处理器很常见 if defined NDEBUG release build endif if defined DEBUG debug build endif Cargo 的大致等价物是 cargo build release以
  • 如何给objc_exception_throw添加断点?

    这是布拉德 拉森对此的回答SO https stackoverflow com questions 1093999 stack trace or more info on unhandled exception in xcode iphon
  • 使用 Julia 的 Debugger.jl - 如何进入类似于 Python 的 pdb.set_trace() 或 ipdb.set_trace() 的调试模式?

    Julia 的新 Debugger jl 很棒 但有时要达到我想要达到的代码中的确切位置有点痛苦 有没有办法可以进入交互式调试模式 类似于 Python 在 pdb set trace 或 ipdb set trace 中的模式 例如 我希
  • 如何使用 PDB 文件

    我听说使用 PDB 文件可以帮助诊断崩溃发生的位置 My basic理解是你给 Visual Studio 源文件 pdb 文件和崩溃信息 来自 Dr Watson 有人可以解释一下这一切是如何运作的 涉及什么吗 谢谢你 PDB 文件将程序
  • 如何调试 MySQL 上的锁等待超时?

    在我的生产错误日志中 我偶尔会看到 SQLSTATE HY000 一般错误 1205 超过锁等待超时 尝试 重新开始交易 我知道当时哪个查询正在尝试访问数据库 但是有没有办法找出哪个查询在那个精确时刻拥有锁定 暴露这一点的是这个词交易 从该
  • emacs 的最佳 java 工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 哪些参数被传递给回溯中的函数?

    在 R 中 如果执行因错误而停止 我可以评估traceback 查看哪个函数发生了错误 哪个函数是从哪个函数调用的 等等 它会给出类似这样的信息 8 ar yw default x aic aic order max order max n
  • 停止所有 JavaScript 执行

    是否有一个相当于 php die 函数的 javascript 可以停止所有 javascript 包括将来的 ajax 请求回调 超时等 运行 注意 我无法在调试器中使用断点 因为 bug 存在于 ie8 中 并且调试器会阻止您在断点处向
  • “do { ... } while (0)”在内核代码中到底做了什么? [复制]

    这个问题在这里已经有答案了 可能的重复 当我们定义宏时 do while 0 有什么用 https stackoverflow com questions 923822 whats the use of do while0 when we
  • 如何调试(最好在 IDE 中)MSBuild 脚本?

    我们非常广泛地使用 MSBuild 作为我们持续集成过程的一部分 虽然它非常强大 我们几乎可以在其中完成所有构建 测试和部署 利用一些自定义任务 我们发现使用标签对其进行调试是一种痛苦 并且不能总是为我们提供足够的信息 我发现 http w

随机推荐

  • Rails 应用程序有批量电子邮件插件吗?

    有谁知道有一个插件或可以用来为 Rails 应用程序发送批量电子邮件的东西吗 具体来说 我希望能够将 HTML 电子邮件文件传递给 rake 任务或其他任务 并将其通过电子邮件发送给所有注册到我的网站并选中 请向我发送有关 XXX 的信息
  • 确定是否通过 FCM 通知单击打开了活动

    我正在使用 fcm 控制台向所有安装了我的应用程序的设备发送消息 通知没有任何额外的有效负载 只有通知消息 我想知道是否有一种简单的方法可以知道是否通过 FCM 通知单击打开了活动 有一个解决方案 通过扩展FirebaseMessaging
  • 模拟索引属性

    我正在使用 Moq 编写单元测试 我创建了一个模拟对象 现在 当我尝试模拟其属性时 我收到错误 表达式树可能不包含索引属性 这是我的代码 public Node GetNode IMyInterface interface string i
  • Pycharm:设置运行manage.py任务的环境变量

    我已经移动了我的SECRET KEY我的设置文件中的值 当我加载 virtualenv 时它会被设置 我可以确认该值存在于python manage py shell 当我运行 Django 控制台时 SECRET KEY失踪了 这是应该的
  • 如何在 Perl 中增加带有前导零的值?

    这是同样的问题this one 但是使用 Perl 我想迭代一个只有一个前导零的值 shell 中的等价物是 for i in seq w 01 99 do echo i done 由于前导零很重要 因此您可能希望将它们用作字符串 而不是数
  • 获取添加的 DOM 节点的 className (mutationObserver)

    我正在编写一个简单的用户脚本 如果 Facebook 帖子包含特定的单词列表 它将自动隐藏该帖子 核心功能有效 但我的MutationObserver似乎没有读过className of mutation addedNodes适当地 我循环
  • char 与 wchar_t

    我正在尝试打印出 wchar t 字符串 代码如下 include
  • 如何验证 ASP.Net MVC 2 中的复选框?

    使用 MVC2 我有一个简单的 ViewModel 其中包含一个布尔字段 该字段在视图上呈现为复选框 我想验证用户是否选中了该框 我的 ViewModel 上的 Required 属性似乎不起作用 我相信这是因为未选中的复选框表单字段实际上
  • 重写虚函数仅因调用约定不同是什么意思?

    我正在尝试实施IUnknown 我按照发球台的说明进行操作 但不起作用 当我尝试编译时 我得到 Error 2 error C2695 testInterfaceImplementation AddRef overriding virtua
  • 是否可以检测 Android 强制门户浏览器?

    我有一个强制门户 从 Android 5 0 Lollipop 开始 它在 Android 的强制门户浏览器而不是设备的默认浏览器中启动 我需要以某种方式检测它们是否在强制门户浏览器中 而不是常规网络浏览器 如果是 则显示不同的内容 是否可
  • 服务器端 Blazor 不提供 HttpClient 进行注入

    当我尝试注入 HttpClient 时 我在 razor 页面中收到错误 未处理的承诺拒绝 错误 System InvalidOperationException 无法为类型上的属性 Http 提供值 没有 类型为 System Net H
  • 使用 Visual Studio 开发服务器时如何让 Web 服务使用固定端口号?

    我有一个 ASP NET 网站和一个 Windows 窗体应用程序 我的网络服务的位置是 http localhost 12312 MyWebSiteFolder WSFile asmx 问题是 端口号不断变化 如果我重新打开解决方案 它会
  • 在获取聊天历史记录时,我没有从 Openfire 获取用户历史记录

    我通过在 open fire 中安装 open fire 插件来从 openfire 获取历史记录并尝试了这段代码 let iq1 DDXMLElement name iq iq1 addAttribute withName type st
  • Kotlin中如何在延迟后调用函数?

    如标题 有没有办法在延迟 例如1秒 后调用函数Kotlin 还有一个选项可以使用Handler gt postDelayed Handler postDelayed doSomethingHere 1000
  • 处理可选的 python 字典字段

    我正在处理加载到 Python 字典中的 JSON 数据 其中很多都有可选字段 其中可能包含字典之类的东西 dictionary1 required value1 one value2 two optional value1 one dic
  • 使 Java 类通用,但仅适用于两种或三种类型

    我很惊讶在 stackoverflow 上找不到这个问题 我只能将其归咎于我的谷歌搜索不佳 无论如何都要指出重复的问题 这是一个玩具类 它返回与您放入其中的内容相反的内容 目前它适用于整数 但只需要非常小的更改即可适用于字符串 public
  • 如何在SceneKit中从Collada文件中分离出多个动画

    我正在将第三方 dae Collada 文件作为场景加载到 SceneKit 项目中 dae 文件中有许多不同的动画 设置在不同的时间 帧 我试图弄清楚如何将它们分开并通过引用名称引用每个单独的动画 dae 文件中没有易于理解的参考名称 动
  • 如何从 Jupyter 4.x 获取 IPython 配置文件行为?

    官方 建议运行 IPython Notebook 服务器 并通过以下方式创建配置文件 ipython profile create nbserver 正如推荐的http ipython org ipython doc 1 interacti
  • DropCreateDatabaseAlways 未调用种子

    我在自定义数据库初始值设定项上调用 Seed 方法时遇到问题 我正在使用 EF 5 0 并具有以下代码 public static class MyDatabase public static void Initialize Databas
  • 是否可以使用gdb和qemu同时调试linux用户空间程序和内核空间?

    到目前为止 使用 gdb qemu 我可以单步执行 Linux 内核源代码 是否可以同时调试用户空间程序 例如 将程序从用户空间单步执行到内核空间 这样我就可以通过发出以下命令来观察 qemu 监视器上寄存器的变化info register