Android内核debugging
我一直在试验让kgdb
工作在Nexus One上。
我已经从https://android.googlesource.com拉内核,并启用一切与kgdb
包括使用menuconfig
kgdbts
testing。 成功构build内核并将其闪存到设备(已解锁并运行CyanogenMod 7)
我也遵循http://bootloader.wikidot.com/android:kgdb上的说明,使usb连接充当kgdb
所需的串行连接(并成功地testing了从ttyACM0
到ttyGS0
通信)。
存在以下文件夹,指示kgdboc
和kgdbts
已内置到内核中:
/sys/modules/kgdboc/parameters /sys/modules/kgdbts/parameters
以下是dmesg的输出,显示正在完成的kgdbts
testing显示什么(我认为)是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会话。
我也用b
和c
testing了/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。