在 qemu 中使用 GDB 调试 Linux 内核无法命中函数或给定地址

2024-01-08

我试图在 qemu 环境中使用 GDB 逐步理解内核启动顺序。

以下是我的设置:

在一个终端中我正在运行

~/Qemu_arm/bin/qemu-system-arm -M vexpress-a9 -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ./arch/arm/boot/zImage -append "root=/dev/mmcblk0 console=ttyAMA0" -sd ../Images/RootFS.ext3 -serial stdio -s -S

在其他终端

arm-none-linux-gnueabi-gdb vmlinux
Reading symbols from vmlinux...done.
(gdb) target remote :1234
Remote debugging using :1234
0x60000000 in ?? ()

我的问题是如何为 /arch/arm/boot/compressed/* files 中的代码设置断点。

例如,我尝试为 Misc.c 中定义的 decompress_kernel 设置断点。

Case 1:

(gdb)  b decompress_kernel
Function "decompress_kernel" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (decompress_kernel) pending.
(gdb) c
Continuing.

上面的一个无法命中qemu正在启动的功能。

Case 2:

(gdb) b *0x80008000
Breakpoint 1 at 0x80008000: file arch/arm/kernel/head.S, line 89.
(gdb) c
Continuing.

在这种情况下,它也无法命中,而是 qemu 正在启动。

Case 3:

(gdb) b start_kernel
Breakpoint 1 at 0x8064d8d8: file init/main.c, line 498.
(gdb) c
Continuing.

Breakpoint 1, start_kernel () at init/main.c:498
498 {
(gdb) 

在这种情况下,功能正在运行,我可以逐步调试。

注意:我已经启用了 debug、Early printk 并尝试了 hbreak

所以我的查询是:

  1. 为什么有些函数无法命中断点?
  2. 这是 qemu 限制还是我需要启用更多功能?
  3. 我需要附加任何额外的参数吗?
  4. 如何调试早期内核启动

您无法在 start_kernel 之前的任何函数上放置断点,因为您没有为它们加载符号。事实上,您正在使用内核的 zImage 启动 qemu,但从 vmlinux 加载符号。它们是不一样的:zImage 基本上是 vmlinux 压缩为数据有效负载,然后附加到存根,存根在内存中解压缩,然后跳转到 start_kernel。

start_kernel 是 vmlinux 的入口点,它之前的任何函数(包括 decompress_kernel)都是存根的一部分,并且不存在于 vmlinux 中。

我不知道执行“arm-none-linux-gnueabi-gdb zImage”是否允许您调试存根,我总是在真实硬件上使用JTAG调试器对ARM内核进行早期调试,并且从未使用过qemu,对不起

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

在 qemu 中使用 GDB 调试 Linux 内核无法命中函数或给定地址 的相关文章

  • 在 Visual Studio 中方法的返回行上检查函数的返回值

    我有一行这样的代码 return foo barIn 如果我在该行上放置一个断点 我可以检查 foo barIn 的返回值而不单步执行 foo 吗 我可以将代码重写为 var result foo barIn return result 但
  • 在 Cocoa/Carbon 下调试 NULL CGContext

    在执行程序期间 我在 XCode 调试控制台中得到以下输出
  • Flask 未激活调试模式

    我正在开始使用 Flask 我正在尝试遵循一些教程 但我无法在调试模式下运行 Flask 应用程序 我尝试了我发现的最简单的代码 from flask import Flask app Flask name app debug True I
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • 如何调试 numpy 掩码

    这个问题与this one https stackoverflow com q 73672739 11004423 我有一个正在尝试矢量化的函数 这是原来的函数 def aspect good angle float planet1 goo
  • Chrome 开发工具:无需切换到“源”选项卡即可进入调试器

    如果我把debugger https developer mozilla org en US docs JavaScript Reference Statements debugger当 Chrome 开发工具打开时 我的 JavaScri
  • 如何调试 Node.js 应用程序?

    如何调试 Node js 服务器应用程序 现在我主要使用警报调试打印语句如下 sys puts sys inspect someVariable 一定有更好的调试方法 我知道谷歌浏览器 http en wikipedia org wiki
  • 在浏览器中查看 javascript 事件

    我正在使用火狐浏览器 有没有什么东西可以向我显示实时触发的所有 JavaScript 事件 您可以右键单击其中的元素Firebug http getfirebug com的 HTML 选项卡并单击日志事件 然后 您将在 控制台 选项卡中看到
  • 在网络处理中使用自旋变体

    我编写了一个与网络过滤器挂钩交互的内核模块 网络过滤器挂钩在 Softirq 上下文中运行 我正在访问全局数据结构 哈希表 来自软中断上下文以及进程上下文 进程上下文访问是由于sysctl文件用于修改哈希表的内容 我正在使用 spinloc
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • Chrome 调试器注入 javascript

    我有这样的好奇心 是否可以以某种方式在我的页面中注入 javascript 并执行它并调试它 正如您在控制台中所做的那样 但在控制台中您无法暂停并观察变量 是否可以调试我通过控制台输入的代码 为什么无法调试通过 XHR 接收的代码 Than
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • html 空格引起的非常奇怪的错误

    我在 Firefox 中遇到了一个非常奇怪的错误 我在外部文件中有一个 javascript 函数 可以在常规复杂性网站上完美运行 然而 我一直在整理一些演示示例并遇到一些奇怪的事情 html 格式如下 在编辑器中 div p Q Wher
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • qemu 访客自动化

    我找不到任何文档说明存在可用于在 qemu guest 内部实现自动化操作的 API 例如 我想从主机启动来宾计算机内部的进程 Libvirt 似乎不包含此类功能 注意 无需使用任何虚拟化 API 即可实现自动化 从我的博客文章 http
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • 无法在 Visual Studio 2010 (F5) 上启动调试器但是,“附加到进程”确实有效(速度慢)。怎么修?

    环境 全新 全新 安装 Windows 7 64 位 全新 新 安装 Visual Studio 2010 Professional 10 0 30319 1 Windows 更新已是最新的 问题 我无法在 Visual Studio 20

随机推荐