我一直在尝试让kgdb
使用Nexus One。
我已从https://android.googlesource.com取出内核并启用kgdb
所有内容,包括使用kgdbts
进行menuconfig
测试。成功构建内核并将其刷新到设备(已解锁并运行CyanogenMod 7)
我还按照http://bootloader.wikidot.com/android:kgdb上的说明操作,使usb连接充当kgdb
所需的串行连接(以及ttyACM0
到{{1}的经过测试的通信成功)。
存在以下文件夹,表明内核已内置ttyGS0
和kgdboc
:
kgdbts
以下是dmesg的输出,显示正在进行的/sys/modules/kgdboc/parameters
/sys/modules/kgdbts/parameters
测试显示(我认为)成功完成了测试:
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
只是导致让我回到命令提示符并且(我认为)假设冻结所有内容并在usb上发送提示,因为手机没有真正的用途,因此它被用作伪装串口。
从我从研究中收集的内容来看,提示应该是允许我发出的触发器
# echo -n g > /proc/sysrq-trigger
并连接到内核的调试会话。
我还使用(gdb) target remote /dev/ttyACM0
和/proc/sysrq-trigger
对b
进行了测试,并确认我能够将一些命令传递给c
。
所以我的问题是在我尽力提供尽可能多的信息之后,为什么sysrq
没有触发调试器?
这是我在任何系统上进行内核调试的第一次尝试,而且我已经没有办法在谷歌上搜索我的搜索,所以我转向你。谢谢!
(我也尝试将kdgbwait放在内核命令行中但没有成功,因为我相信Android内核尚不支持)
答案 0 :(得分:6)
Android内核问题在[SO]上很少见,因为没有其他人回答我在这个问题上提供了我的发现。不幸的是,我没有一个nexus来测试这个,所以这个答案不是为了逐步解决你的问题,而是应该指出你在哪里看的正确方向。
我在这个问题上找到的唯一有用的资源是LKML patch by Dongdong Deng,所以配置问题不太可能,因为这些资源通常很丰富且广为人知。
这表明内核构建存在问题。我很想再次使用最新版本的CM,看看问题是否消失了。
如果做不到这一点,请尝试向氰基团队报告,看看这是一个已知问题还是有一个简单的解决方法。
作为最后的手段,如果版本兼容,您可以尝试修补程序。唯一的选择是卷起你的袖子并开始攻击CM内核以合并补丁。
祝你好运。答案 1 :(得分:2)
我没有Android硬件的经验,但我已经将kgdb编译的内核作为VirtualBox客户端运行,并从主机通过虚拟串口连接到guest虚拟机,并使用gdb(使用标准的“target remote”命令)我可以在kgdbwait的帮助下逐步完成虚拟客户内核的整个启动。如果没有这个,我可以编写一个内核模块,除了实现一个名为“int 13”的内联汇编(0xcc)之外什么都不做。加载后,断点将出现在串行连接的主机端,然后我可以设置断点并继续执行内核。这是有效的,因为kgdb处理异常“int 13”。如果你明确地创建了其他类型的异常,比如“* p = 0”,并且p指向NULL,你仍然会得到一个断点,但我怀疑你是否可以继续执行。
答案 2 :(得分:2)
从related post发现这篇文章并想说我刚刚发布了一些我为Nexus 6工作的工作,如果有人有兴趣的话:
http://www.contextis.com/resources/blog/kgdb-android-debugging-kernel-boss/
有趣的是,OP的问题与sysrq是我遇到过的问题。这种行为的原因是KGDB没有正确初始化,因此它无法安装&#39;#39; (kgdb)触发器。这就是为什么所有其他sysrq命令仍然有效的原因。
更长的解释(感谢@Robert):
为了实现这一点,我必须根据this Accuvant blog制作UART调试电缆。这是一个非常简单的电路,包括FTDI 3.3v基本突破(在撰写本文时可从SparkFun获得),以及4个电阻(2 x 1K欧姆,1 x 1.2K欧姆和1 x 100欧姆),以及4元件Tip-Ring-Ring-Sleeve(TRRS)耳机插孔。这些电阻基本上都是一个分压器,可以将3.3v降低到手机的安全性。通过插入音频插孔,另一端连接到电路板,音频子系统识别出其中一个引脚上的电压(~2.8V),它知道通过该电缆提供UART接口。 FTDI突破通过USB插入您的PC,从这里您可以通过终端模拟器(如minicom)访问控制台消息。但是,您现在拥有一个通过相同机制的串行接口,以及我们可以用于KGDB连接的接口。
因此,此时需要对Nexus 6的串行驱动程序(msm_serial_hs_lite.c)进行一些相对较小的更改以支持KGDB(特别是执行原子字符I / O操作的能力)。我刚刚从Linux内核主线代码中移植了这些更改,因为一个名为Stephen Boyd的人已经完成了对完整的MSM(Qualcomm)串行驱动程序msm_serial.c的辛勤工作。他的更改可以是found here,也可以只搜索&#34; msm_serial:添加对民意调查的支持_&#34;在谷歌上。端口并不困难,我的代码可以是found on github。
除此之外,您需要能够为您的N6构建自定义内核,谷歌提供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.img启动它,打开一个adb shell,然后使用以下命令触发Android内核中的断点:
echo -n g > /proc/sysrq-trigger
值得一提的是,为了完整性,您需要超级用户权限才能访问/ proc / sysrq-trigger,因此您需要拥有root权限。
手机停止运行并连接调试电缆后,在主机PC上启动一个版本的GDB for ARM,并将未压缩的内核作为参数(例如arm-eabi-gdb ./vmlinux)。注意:我正在运行Ubuntu 14.04并使用来自&#39; prebuilts&#39;的arm-eabi-gdb。我的AOSP源存储库中的目录。最后,输入以下命令:
set remoteflow off
set remotebaud 115200
target remote /dev/ttyUSB0
一切都很好,这应该立即进入kgdb断点(你写入/ proc / sysrq-trigger产生)并且你可以开始调试。