在 Windows 主机上调试 VMWare 中的 Linux 内核

2023-12-06

我正在开发我的第一个内核模块,所以我对此有点陌生......

我的模块偶尔会产生恐慌,并且我无法使用 printk 深入了解它。据我所知,我的调试选项是:

1.) 找到生成的OOPS消息并使用ksymoops

or

2.) 尝试使用 kgdb 进行远程调试

我正在 Windows 主机上工作并在 VMWare 中运行 Ubuntu,因此这使事情变得有点复杂。我想先尝试 OOPS 消息,但我不知道如何捕获它。发生这种情况时我是否需要运行串行控制台?如果是这样,我该如何在 Windows 主机上做到这一点?我需要两个虚拟机吗?

就像我说的,我对此(以及一般的 Linux)有点陌生,所以我真的可以使用一些指导。谢谢!


不久前我成功地使用了“alinrus”所指的技术。他提到的部分详细解释在:http://stackframe.blogspot.com/2007/04/debugging-linux-kernels-with.html

我实际上是直接从 Windows 主机上使用它的。所以设置好VM后(主要是启用远程调试和下载内核(vmlinux文件,notgdb 无法解释的 vmlinuz 文件)),您需要执行以下操作:

  1. 在 Windows 机器上安装最新的 gdb(我在 Cygwin 中使用过)。
  2. 使用 vmlinux 文件启动 gdb,然后执行“target remote localhost:8832”来连接虚拟机(当虚拟机运行时)。

这就是调试静态链接到内核的代码所需的。您可以尝试静态链接您的模块,上面的内容就足够了。为动态链接模块设置调试需要额外的步骤来通知 gdb 使用模块文件,以及如何解释文件的部分。

3a.加载模块后(在模块崩溃之前:)),在 .ko 文件上运行下面的脚本。

3b.将生成的“add-symbol-file mymodule.ko 0xe8884000 ...”行粘贴到 gdb 中。然后,gdb 将加载您的模块,只要它可以在当前目录或您指定的路径中找到它。

脚本来自http://anomit.com/2009/11/04/kernel-module-debugging-a-simple-technique/



#!/bin/sh
#
# gdbline module image
#
# Outputs an add-symbol-file line suitable for pasting into gdb to examine
# a loaded module.
#
cd /sys/module/$1/sections
PROG=${1}.ko
echo -n add-symbol-file ${PROG} `/bin/cat .text`
#echo -n add-symbol-file $2 `/bin/cat .text`  #Take second argument to be gdb name of program/object file

for section in .[a-z]* *; do
    if [ $section != ".text" ]; then
        echo  " \\"
        echo -n "       -s" $section `/bin/cat $section`
    fi
done
echo
  

您可能还有更多想做的事情。要进行实际的源代码级调试,您需要获取所有内核和模块源代码,以便 gdb 可以找到它。一旦你做到了这一点,你可以使用一些技巧来编译你的模块而无需优化。

您可能还想查看 Workstation 7.0 关于重播调试的技术说明,其中包含有关调试内核模块的信息。 VMware 了解他们的东西。http://www.vmware.com/pdf/ws7_replay_linux_technote.pdf

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

在 Windows 主机上调试 VMWare 中的 Linux 内核 的相关文章

  • 在linux中找不到syscall_table_32.S文件

    我正在使用linux headers 2 6 32 21虚拟机上的包 我要编写一个新的系统调用 我找到了其他文件来写入系统调用的缩写 但我找不到这个syscall table 32 S in arch x86 kernel 目录 请帮助我如
  • 当我们定义宏时,do while(0)有什么用? [复制]

    这个问题在这里已经有答案了 可能的重复 C C 宏中的 Do While 和 if else 语句 https stackoverflow com questions 154136 do while and if else statemen
  • 基于 BBB DT 的方法

    我已经使用平台设备模型成功为我的自定义协议实现了基于 GPIO 的驱动程序 我想使用设备树方法升级它 因此 对于初学者来说 我有一个 beaglebone black 并且我使用在 uboot 控制台消息显示期间启用和验证的设备树配置交叉编
  • Linux 下签名的可执行文件

    出于安全原因 最好在执行之前检查代码的完整性 避免软件被篡改由攻击者发起 所以 我的问题是 如何在Linux下对可执行代码进行签名并仅运行受信任的软件 我读过范杜姆的作品et al Linux 签名可执行文件的设计和实现 以及 IBM 的T
  • 在设备驱动程序中使用 select()/poll()

    我有一个驱动程序 它可以处理多个 TCP 连接 有没有一种方法可以在给定列表的情况下执行类似于内核中用户空间应用程序 api 的 select poll epoll 的操作struct sock s Thanks 您可能想编写自己的自定义s
  • ARM架构中不同处理器模式下如何使用内核堆栈?

    据我了解 每个进程都有一个用户堆栈和内核堆栈 除此之外 ARM 架构中的每种模式都有一个堆栈 所以我想知道不同的堆栈和堆栈指针在 ARM 模式下如何工作 另外 何时会使用与进程关联的内核堆栈 何时会使用与进程关联的内核堆栈 当您进行系统调用
  • tcp_max_syn_backlog 和 somaxconn 有什么区别?

    我一直在阅读一些关于 Linux 上的 TCP 实现的文章 我很困惑 它们之间有什么区别net ipv4 tcp max syn backlog and net core somaxconn和backlog作为参数传递给listen 系统调
  • Linux 内核:为什么调用 kstrtol 会崩溃?

    我正在学习内核编程 并且对 kstrtol 进行了简单的调用 我用它来将字符串转换为数字 然而 每次我编译这个模块并使用 insmod 将其放入内核时 我都会收到 BUG 无法处理 f862b026 处的内核分页请求 然后是寄存器和堆栈转储
  • 使用 GCC 为 Linux 设备驱动程序编译 Intel AVX 内联

    我在 corei7 上的 ubuntu 上运行 gcc 版本 4 8 2 从谷歌搜索中找到了有关 AVX 内在函数的信息 但我不确定这组内在函数是否可以用于 Linux 设备驱动程序并进行编译 如果可以的话 这里的任何人都可以告诉我 mak
  • USB 端口速度 Linux [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何以编程方式确定运行 Linux 内核的嵌入式设备中的 USB 端口速度 你可以阅读 sys bus usb devices usb s
  • dmesg 和 /var/log/kern.log 之间的区别

    我正在修改kvm模块 并在内核代码中添加了printk语句 运行虚拟机后 printk为我提供了错误地址和有关客户操作系统的其他信息 我需要根据此信息生成统计信息 当我使用 dmesg 时 我只能看到错误地址 在内核空间中 即它们的地址高于
  • 如何在 VMWare 中查看 Django 开发服务器?

    我正在尝试从运行 Windows 的 VMWare 连接到在 OS X localhost 8000 中运行的 Django 开发服务器 我尝试了各种设置组合 但似乎都不起作用 在 localhost 8000 上运行 Django 服务器
  • 如何编写需要内核源头文件的 BitBake 驱动程序配方?

    介绍 我有一个do install我为驱动程序编写的 BitBake 配方中的任务 我在其中执行自定义install脚本 任务失败 因为安装脚本无法在其中找到内核源头文件
  • 使用Linux虚拟鼠标驱动

    我正在尝试实施一个虚拟鼠标驱动程序根据基本 Linux 设备驱动程序书 有一个用户空间应用程序 它生成坐标以及内核模块 See 虚拟鼠标驱动程序和用户空间应用程序代码 http www embeddedlinux org cn Essent
  • vm.dirty_ratio 和 vm.dirty_background_ratio 之间的区别?

    我目前正在试验中找到的内核参数 proc sys vm 尤其dirty ratio and dirty background ratio 内核文档对两者都有以下解释 脏背景比例 包含 以包含空闲页面的总可用内存的百分比表示 和可回收页 后台
  • “do { ... } while (0)”在内核代码中到底做了什么? [复制]

    这个问题在这里已经有答案了 可能的重复 当我们定义宏时 do while 0 有什么用 https stackoverflow com questions 923822 whats the use of do while0 when we
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些

随机推荐

  • 无法打开数据库/无法将(数据库)的区域设置更改为“en_US”

    我已阅读解决方案无法将数据库 data data my easymedi controller databases EasyMediInfo db 的区域设置更改为 en US 但这对我没有帮助 我仍然有同样的错误 这些是我的DBHelpe
  • Spark提交抛出错误java.lang.ClassNotFoundException: scala.runtime.java8.JFunction2$mcIII$sp

    我编写了一个字数统计代码 但是当我尝试使用以下命令从 Windows 中的 CMD 运行它时 它会抛出异常 spark submit class com sample WordCount master local file E WordCo
  • 如何使用正则表达式验证多封电子邮件?

    在对 Stackoverflow 进行快速研究后 我无法找到使用正则表达式进行多电子邮件验证的任何解决方案 拆分 JS 函数不适用 但由于某种原因 应用程序后端等待一个电子邮件以 分隔的字符串 以下是要求 应使用以下规则验证电子邮件 A Z
  • 如何知道@RequestMapping的哪个参数被调用

    这是我的 RequestMapping注解 RequestMapping loginBadCredentials loginUserDisabled loginUserNumberExceeded public String errorLo
  • Outlet 无法连接到 CollectionView 单元格中的重复内容

    当我尝试连接已声明为的 UICollectionViewCell 中的 UILabel 时 property nonatomic weak IBOutlet UILabel Title 它表明 插座无法连接到重复内容 我做了一些搜索 发现我
  • 在 Python 中使用 WlanScan 强制 wifi 扫描

    我想知道如何执行WlanScanpython 中的函数用于启动无线网络扫描 我正在使用 python 模块win32wifi 它需要使用获得的句柄WlanOpenHandle和接口 GUIDpInterfaceGuid 我不知道如何获得这个
  • 如何将附加变量传递到下划线模板

    我有一个主干视图 它在下划线模板中呈现搜索结果 由于我想在结果中突出显示搜索词 因此我在模板中使用了以下打印方法 print someKey replace searchTerm b searchTerm b 它按预期工作 但我必须设置se
  • 如何在 SQL Server 2017 中对简单 Json 数组执行Where子句?

    假设我的数据库中有一个名为attributes以具有此值为例 pages Page1 我怎样才能做一个where子句 以便我可以过滤掉其中包含 Page1 的行 select JSON QUERY Attributes pages from
  • 第一次没有创建数据库

    如何使用EF6重新创建数据库 我已经尝试过以下两篇文章 但是 我不知道为什么它不起作用并出现相同的错误 如何在不使用更新数据库的情况下生成启用了迁移的 EF6 数据库 已为上下文启用迁移 但数据库不存在或不包含映射表 我已经在网络服务器上发
  • 使用 AR(1) 项进行 OLS 估计

    由于我无法解释的原因 因为我不能 不是因为我不想 我办公室使用的流程需要在 Eviews 上运行一些回归 Eviews 上使用的方程规范为 dependent variable c independent variable ar 1 此外
  • OpenCover MSBuild 集成 - 未生成结果

    让 OpenCover 在我的机器上工作后 下一步是让它与构建服务器一起工作 我一直在尝试将 OpenCover 与 Bamboo Build Server 上的 MSBuild 集成 我已按如下方式修改了 Build proj 以在构建解
  • Laravel 5 中的加密和解密

    我一直在寻找有关在 Laravel 中加密和解密值的想法 例如 VIN 号 员工 ID 卡号 社会保障号等 最近在 Laravel 网站上发现了这一点 https laravel com docs 5 6 加密 我的问题是 如何在刀片模板上
  • imshow() 将灰色图像显示为白色图像

    我计算了一个值在 0 到 255 之间的图像 当我使用 imageview 时 图像以灰度正确显示 但是当我想保存该图像或用 imshow 显示它时 我有一个白色图像 或者有时到处都有一些黑色像素 而使用 imageview 时 有人能帮我
  • YT 未定义 - 未捕获的 ReferenceError:[youtube api]

    删除了不需要的代码演示 嘿 我正在实现 Youtube Video Player Api 我在控制台中看到某种错误 视频如何完美播放 但我想知道为什么会出现错误 如果我将代码保留在骨架模式之外 就不会出现任何错误 有人可以解释一下吗 Tha
  • 具有自定义列渲染器排序的 Rally 网格

    背景 当我尝试按使用自定义渲染器的列进行排序时 没有任何反应 它将排序从 ASC 更改为 DESC 来回更改 但数据的顺序从未改变 我假设这是因为没有定义如何对我使用自定义渲染器操作的数据进行排序 但我似乎找不到向列添加排序器或排序函数的方
  • Chrome 放弃了 Java 支持

    我在我的应用程序中使用 Java 小程序 今天我惊讶地看到了redirect来自我的页面和来自 java 的下一条消息 In details我读过有关 Chrome 放弃 NPAPI 支持的报道 最近 谷歌修改了他们的计划 现在声明他们计划
  • 有没有可以将数字拼音转换为带有声调标记的拼音的库?

    只是想知道是否有人知道可以将汉语拼音转换为声调的类库 例如 nin2 hao3 ma 到 n n h o ma 它会类似于这个答案 但希望使用 NET 框架 这是我对 Greg Hewgill 的移植蟒蛇算法到 C 到目前为止我还没有遇到任
  • 刚开始学习Java。为什么 main() 位于类内部?

    我正在学习 Java 我注意到main 被放在一个类中 为什么 我不考虑我的main 成为任何对象的成员 所以请告诉我如何解决这个问题 我不考虑我的main 成为任何对象的成员 这不是因为它是一个static方法 它不属于任何对象 而是属于
  • 在法国机器上执行时出现 java.lang.NumberFormatException

    在下面的代码中 在解析值时 有时我会在法国机器上遇到 NumberFormat 异常 double txPower DecimalFormat df new DecimalFormat txPower txPower getDeltaP l
  • 在 Windows 主机上调试 VMWare 中的 Linux 内核

    我正在开发我的第一个内核模块 所以我对此有点陌生 我的模块偶尔会产生恐慌 并且我无法使用 printk 深入了解它 据我所知 我的调试选项是 1 找到生成的OOPS消息并使用ksymoops or 2 尝试使用 kgdb 进行远程调试 我正