我正在尝试为Nexus One进行内核调试,并一直按照http://bootloader.wikidot.com/android:kgdb的说明进行操作。我想知道是否有人真的可以使用此功能?有没有人为使用KGDB调试内核做过最新的解决方案?
最佳答案
我在Android上查找KGDB的信息时找到了这篇文章,因此,尽管它已有数年历史,但我认为值得发布指向我为在Nexus 6上启动并运行而进行的一些工作的链接。
http://www.contextis.com/resources/blog/kgdb-android-debugging-kernel-boss/
希望这对其他寻求类似答案的人有所帮助。
编辑了以下反馈(感谢所有反馈):
为了使该工作正常进行,我必须制作基于this Accuvant blog的UART调试电缆。这是一个非常简单的电路,由FTDI 3.3v基本分支(在编写本文时可从SparkFun提供)以及4个电阻(2 x 1K Ohm,1 x 1.2K Ohm和1 x 100Ohm)和一个电阻组成。 4元素的Tip-Ring-Ring-Sleeve(TRRS)耳机插孔。电阻器实质上是提供一个分压器,以将3.3v降低至对您的手机而言更安全的水平。通过将音频插孔的另一端连接到电路板上,音频子系统可以识别出其中一个引脚上的电压(〜2.8V),并且知道可以通过该电缆提供UART接口(interface)。 FTDI分支通过USB插入您的PC,您可以从此处通过minicom之类的终端仿真器访问控制台消息。但是,您现在可以通过相同的机制获得一个串行接口(interface),这就是我们可以用于KGDB连接的方式。
因此,在这一点上,需要对Nexus 6的串行驱动程序(msm_serial_hs_lite.c)进行一些相对较小的更改,以支持KGDB(特别是执行原子字符I/O操作的能力)。我只是从Linux内核主线代码中移植了these changes,因为一个名叫Stephen Boyd的小伙子对完整的MSM(Qualcomm)串行驱动程序msm_serial.c做了艰苦的工作。他的更改可以在这里找到,也可以在Google上搜索“msm_serial:添加对poll_的支持”。端口并不难,我的代码可以是found on github。
除此之外,您需要能够为您的N6构建一个自定义内核google provides lots of information on。然后,您需要在github存储库中创建一个包含KGDB修改的启动镜像。我从https://developers.google.com/android/nexus/images提取了库存内核,(使用abootimg -x)将其提取,然后使用以下命令将其与我的自定义内核(zImage-dtb)和其他命令行参数重新打包,以确保将加载KGDB并指向我的序列号。像这样的端口:
abootimg -u boot.img -k zImage-dtb -c 'cmdline=console=ttyHSL0,115200,n8 kgdboc=ttyHSL0,115200 kgdbretry=4'
创建好boot.img之后,我可以使用命令fastboot boot boot boot.img来启动它,打开adb shell,然后使用以下命令在Android内核中触发断点:
echo -n g > /proc/sysrq-trigger
出于完整性考虑,值得一提的是,您需要 super 用户特权才能访问/proc/sysrq-trigger,因此您需要具有root用户。
在电话停下并连接调试电缆的情况下,在主机PC上以未压缩的内核作为参数启动一个GDB for ARM版本(例如arm-eabi-gdb ./vmlinux)。注意:我正在运行Ubuntu 14.04,并从AOSP源存储库中的“prebuilts”目录中使用arm-eabi-gdb。最后,输入以下命令:
set remoteflow off
set remotebaud 115200
target remote /dev/ttyUSB0
一切顺利,这应该立即进入kgdb断点(您对/proc/sysrq-trigger的写操作产生的断点),然后就可以开始调试了。