Android内核debugging

我一直在试验让kgdb工作在Nexus One上。

我已经从https://android.googlesource.com拉内核,并启用一切与kgdb包括使用menuconfig kgdbtstesting。 成功构build内核并将其闪存到设备(已解锁并运行CyanogenMod 7)

我也遵循http://bootloader.wikidot.com/android:kgdb上的说明,使usb连接充当kgdb所需的串行连接(并成功地testing了从ttyACM0ttyGS0通信)。

存在以下文件夹,指示kgdbockgdbts已内置到内核中:

 /sys/modules/kgdboc/parameters /sys/modules/kgdbts/parameters 

以下是dmesg的输出,显示正在完成的kgdbtstesting显示什么(我认为)是testing的成功完成:

 # dmesg | grep kgdb <6>[ 12.974060] kgdb: Registered I/O driver kgdbts. <6>[ 12.981781] kgdbts:RUN plant and detach test <6>[ 12.995178] kgdbts:RUN sw breakpoint test <6>[ 13.002441] kgdbts:RUN bad memory access test <6>[ 13.010864] kgdbts:RUN singlestep test 1000 iterations <6>[ 13.019042] kgdbts:RUN singlestep [0/1000] <6>[ 13.077850] kgdbts:RUN singlestep [100/1000] <6>[ 13.132720] kgdbts:RUN singlestep [200/1000] <6>[ 13.187500] kgdbts:RUN singlestep [300/1000] <6>[ 13.242370] kgdbts:RUN singlestep [400/1000] <6>[ 13.297149] kgdbts:RUN singlestep [500/1000] <6>[ 13.351928] kgdbts:RUN singlestep [600/1000] <6>[ 13.406829] kgdbts:RUN singlestep [700/1000] <6>[ 13.461578] kgdbts:RUN singlestep [800/1000] <6>[ 13.516540] kgdbts:RUN singlestep [900/1000] <6>[ 13.570922] kgdbts:RUN do_fork for 100 breakpoints <6>[ 21.117645] kgdb: Unregistered I/O driver kgdbts, debugger disabled. 

我相信我遇到的问题是让内核触发kgdb

 # echo -ng > /proc/sysrq-trigger 

只是导致我放弃回到命令提示符(我认为)这是假设冻结一切,并发送提示通过USB作为假串口使用,因为手机没有一个真正的。

从我的研究中得出的结论是,提示应该是允许我发出的触发器

 (gdb) target remote /dev/ttyACM0 

并连接到内核的debugging会话。

我也用bctesting了/proc/sysrq-trigger ,确认我能够将一些命令传递给sysrq

所以我的问题是,为了尽可能多的提供尽可能多的信息,为什么g不能触发debugging器?

这是我在任何系统上的内核debugging的第一次尝试,我已经用尽了方法来在谷歌上search我的search,所以我转向你。 谢谢!

(我也尝试把kdgbwait放在内核命令行中,没有成功,因为我认为android内核还不支持这个function)

Android内核问题在[SO]上很less见,因为没有人回答我提供了关于这个问题的发现。 不幸的是,我没有一个联系人来testing这个问题,所以这个答案不是为了一步一步地解决你的问题,而是应该指出你在哪里寻找正确的方向。

我在这个问题上find的唯一有用的资源是在Dongdong Deng的LKML补丁中 ,所以不太可能出现configuration问题,因为这些资源通常很丰富,而且是公开的。

这表明您的内核版本存在问题。 我会试着重新开始CM的最新版本,看看问题是否会消失。

如果没有,请尝试向氰组报告,看看这是一个已知问题还是有一个简单的解决方法。

作为最后的手段,你可以尝试补丁,如果版本兼容。 唯一的select是卷起袖子,开始黑客攻击CM内核来整合这个补丁。

祝你好运。

我没有使用Android硬件的经验,但是我已经完成了作为VirtualBox客户端运行的kgdb编译内核,并且从主机通过虚拟串行端口连接到guest虚拟机,并使用gdb(使用标准的“target remote”命令)通过虚拟客户机内核的整个启动 – 在kgdbwait的帮助下。 没有这个,我可以编写一个内核模块,除了实现一个名为“int 13”的内联程序集,它是0xcc。 一旦加载,串行连接的主机端就会出现一个断点,然后我可以设置断点并继续执行内核。 这是因为kgdb处理exception“int 13”。 如果你明确地创build了其他types的exception,例如“* p = 0”,并且p指向NULL,你仍然会得到一个断点,但是我怀疑你是否可以继续执行。

发现这篇文章从一篇相关的post,并想说我刚刚发表了一些工作,我做了这个在Nexus 6上工作,如果有人感兴趣:

http://www.contextis.com/resources/blog/kgdb-android-debugging-kernel-boss/

有趣的是,OP的sysrq问题也是我遇到的问题之一。 这种行为的原因是KGDB未正确初始化,因此无法安装“g”(kgdb)触发器的处理程序。 这就是为什么所有其他的sysrq命令仍然有效。

更长的解释(谢谢@罗伯特):

为了得到这个工作,我必须在这个Accuvant博客上制作一个UARTdebugging电缆。 这是一个非常简单的电路,它包括一个FTDI 3.3v基本跳线(可从本文撰写之时的SparkFun获得)以及4个电阻(2 x 1K欧姆,1 x 1.2K欧姆和1 x 100欧姆)以及一个4个元素的Tip-Ring-Ring-Sleeve(TRRS)耳机插孔。 电阻器本质上是提供一个分压器,以减less3.3伏,为您的手机更安全一些。 通过插入audio插孔,将另一端连接到电路板,audio子系统识别其中一个引脚上的电压(〜2.8V),并知道通过该电缆提供UART接口。 FTDI breakout通过USB插入你的电脑,从这里你可以通过像minicom这样的terminal仿真器访问控制台消息。 但是,现在通过相同的机制有一个串行接口,这就是我们可以使用的KGDB连接。

所以在这一点上,Nexus 6的串行驱动程序(msm_serial_hs_lite.c)需要一些相对较小的改变来支持KGDB(特别是执行primefaces字符I / O操作的能力)。 我刚刚从Linux Kernel主线代码移植了这些变化,Stephen Boyd曾经为完整的MSM(Qualcomm)串行驱动程序msm_serial.c做了艰苦的工作。 他的更改可以在这里find,或者只是在Google上search“msm_serial:添加对poll_的支持”。 端口并不困难,我的代码可以在github上find 。

除此之外,你需要能够为你的N6build立一个自定义内核,谷歌提供了大量的信息 。 然后你需要创build一个启动镜像,其中包含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' 

使用我创build的boot.img,我可以使用命令fastboot boot boot.img启动它,打开一个adb shell,然后使用以下命令在Android内核中触发一个断点:

 echo -ng > /proc/sysrq-trigger 

完整性值得一提的是,您需要超级用户权限才能访问/ proc / sysrq-trigger,因此您需要具有root权限。

在手机停止工作,并且连接了debugging电缆的情况下,在您的主机上以未压缩的内核作为参数(例如arm-eabi-gdb ./vmlinux)启动ARM的GDB版本。 注意:我正在运行Ubuntu 14.04,并使用我的AOSP源代码库中'prebuilts'目录下的arm-eabi-gdb。 最后,input以下命令:

 set remoteflow off set remotebaud 115200 target remote /dev/ttyUSB0 

一切正常,这应该立即进入kgdb断点(即写入/ proc / sysrq-trigger产生的),然后开始debugging。