我一直在尝试让 kgdb
在 Nexus One 上工作。
我从 https://android.googlesource.com 获取了内核,并在使用 menuconfig
时启用了与 kgdb
有关的所有内容,包括 kgdbts
测试。成功构建了内核,并刷入了设备(该设备已解锁,带 root 权限,运行 CyanogenMod 7)。
我还按照 http://bootloader.wikidot.com/android:kgdb 上的说明启用了 usb 连接,以便按照 kgdb
的要求将其作为串行连接使用(并且已经成功地从 ttyACM0
到 ttyGS0
进行了通信测试)。
下面这些文件夹存在,表明 kgdboc
和 kgdbts
已经被编译进内核中:
/sys/modules/kgdboc/parameters
/sys/modules/kgdbts/parameters
以下是来自 dmesg 的输出,展示了正在进行的 kgdbts
测试,并展示了(我认为)测试成功完成:
# 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 -n g > /proc/sysrq-trigger
执行该命令后,我被强制返回到命令提示符,并且(我认为)它应该冻结所有内容并通过 USB 发送提示符号,该 USB 用作伪串行端口,因为手机没有真正的串行端口。
从我的研究中所了解的是,该提示符应该是触发器,允许我发出命令。
(gdb) target remote /dev/ttyACM0
然后连接到内核的调试会话。
我还测试了使用/proc/sysrq-trigger
和b
,c
确认我能够向sysrq
传递一些命令。
所以,根据我尽可能提供的信息,我要问的问题是为什么g
不能触发调试器?
这是我第一次在任何系统上进行内核调试,我已经没有办法用不同的方式在谷歌上搜索了,所以我求助于你。谢谢!
(我还尝试在内核命令行中放置kdgbwait
,但没有成功,因为我认为这在Android内核中尚未得到支持)