linux - 使用 gdb 在 Qemu 上调试 init

标签 linux gdb init qemu

我正在尝试在 Qemu 上模拟 cavium octeon 的 mips64 linux 内核。我目前在使用模式 init 代码方面遇到一些问题,想调试 init。我在命令行中使用 -s -S 选项启动 Qemu 并运行gdb 使用命令

ddd --debugger/OCTEON-SDK/tools/bin/mips64-octeon-linux-gnu-gdb/OCTEON-SDK/linux/kernel_2.6/linux/vmlinux

然后用命令附加gdb

目标远程 localhost:1234

gdb 当前仅显示在内核空间中运行的指令。

我想问的是,有什么方法可以像在内核空间中一样逐步调试用户模式初始化和库指令? 例如,如果 printf 是从 init 发出的,那么我想查看哪些指令正在库中执行,以及控制权如何返回给内核?

最佳答案

我已经成功调试 BusyBox 的 /sbin/init使用以下描述的程序:Is it possible to use gdb and qemu to debug linux user space programs and kernel space simultaneously?

您必须牢记的唯一额外事项是:

  • /sbin/init只是 busybox 的符号链接(symbolic link), 所以你必须使用 /bin/busybox作为目标文件
  • /sbin/init 的“主要”功能实际上是 init_main ,遵循 BusyBox 的约定,将每个伪可执行文件的主函数调用为 <exec>_main

它有点不稳定,但大部分都能正常工作。

关于linux - 使用 gdb 在 Qemu 上调试 init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16273614/

相关文章:

go - 导入cgo时无法运行init()函数,且导入 “C”

Python 类 - 如何创建接受未定义数量的参数的类?

java - Applet 不将变量从 init 方法传递到 Paint 方法

linux - nohup 错误没有那个文件或目录

linux - Bash 将命令解析为二维数组

linux - 遍历 unix 数组并获取最后一个字符并附加字符串

linux - 以另一个用户身份执行脚本而不是 root

c - 结构体初始化导致段错误

visual-studio - 如何获取GDB中的物理地址?

C代码在RHEL7中构建并部署在RHEL6中,gdb不工作