首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android内核调试

Android内核调试
EN

Stack Overflow用户
提问于 2011-07-15 01:55:40
回答 3查看 11K关注 0票数 62

我一直在尝试让kgdb在Nexus One上运行。

我已经从https://android.googlesource.com中提取了内核,并启用了与kgdb相关的所有功能,包括使用menuconfig进行kgdbts测试。已成功构建内核并将其刷新到设备(已解锁,已启动并运行CyanogenMod 7)

我还按照http://bootloader.wikidot.com/android:kgdb上的说明按照kgdb的要求启用了usb连接作为串行连接(并成功测试了从ttyACM0ttyGS0的通信)。

存在以下文件夹,表明kgdbockgdbts已内置于内核:

/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

并连接到与内核的调试会话。

我还用bc测试了/proc/sysrq-trigger,只要确认我可以向sysrq传递一些命令即可。

因此,在我试图提供尽可能多的信息之后,我的问题是为什么g不触发调试器?

这是我第一次尝试在任何系统上调试内核,我已经没有办法在google上表达我的搜索了,所以我转向了你。谢谢!

(我也尝试过将kdgbwait放在内核命令行中,但没有成功,因为我相信android内核还不支持它)

EN

回答 3

Stack Overflow用户

发布于 2011-08-31 19:17:38

Android内核问题在SO上很少见,因为没有其他人回答过我对这个问题的调查结果。不幸的是,我没有一个联结点来测试这个问题,所以这个答案并不是为了一步一步地解决你的问题,而是应该为你指明正确的方向。

我在这个问题上找到的唯一有用的资源是在LKML patch by Dongdong Deng中,所以它不太可能是一个配置问题,因为它们通常是丰富的和广为人知的。

这表明您的内核构建存在问题。我很想重新开始使用最新版本的CM,看看问题是否会消失。

如果做不到这一点,请尝试将此问题报告给氰根团队,看看这是一个已知问题还是有简单的解决方法。

作为最后的手段,如果版本是兼容的,你可以尝试这个补丁。唯一的选择是卷起袖子,开始修改CM内核以包含补丁。

祝好运。

票数 6
EN

Stack Overflow用户

发布于 2011-11-08 08:32:17

我没有使用Android硬件的经验,但我做过kgdb编译的内核作为VirtualBox客户端运行,从主机通过虚拟串口连接到来宾,使用gdb (使用标准的"target remote“命令),我可以在kgdbwait的帮助下逐步完成虚拟来宾内核的整个启动过程。如果没有它,我可以编写一个内核模块,它除了实现名为“int13”的内联程序集之外什么也不做,即0xcc。加载后,串行连接的主机端将出现断点,然后我可以设置断点并继续执行内核。这之所以有效,是因为kgdb处理了异常“int13”。如果你显式地创建了其他类型的异常,比如"*p = 0",并且p指向NULL,那么你仍然会得到一个断点,但我怀疑你是否能继续执行。

票数 2
EN

Stack Overflow用户

发布于 2015-08-17 17:36:12

我从一个related post上找到了这篇文章,想说我刚刚发表了一些工作,如果有人感兴趣的话,我做了一些在Nexus6上工作的工作:

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

有趣的是,OP的sysrq问题也是我遇到的一个问题。出现此现象的原因是KGDB没有正确初始化,因此它无法安装'g‘(kgdb)触发器的处理程序。这就是为什么所有其他sysrq命令仍然有效的原因。

更长的解释(感谢@Robert):

为了让它正常工作,我必须制作一条基于this Accuvant blog的UART调试电缆。这是一个相当简单的电路,由一个FTDI3.3V基本分路器(在撰写本文时可从SparkFun获得)、4个电阻器(2 x 1K欧姆、1 x 1.2K欧姆和1 x 100欧姆)和一个4元件针尖环套(TRRS)耳机插孔组成。电阻本质上提供了一个电压分压器,将3.3v的电压降低到对你的手机更安全的地方。通过插入音频插孔,另一端连接到您的电路板,音频子系统识别其中一个引脚上的电压(~2.8V),并知道通过该电缆提供UART接口。FTDI breakout通过USB插入您的PC,从这里您可以通过minicom等终端仿真器访问控制台消息。但是,您现在有了一个通过相同机制的串行接口,这就是我们可以用于KGDB连接的接口。

因此,在这一点上,需要对Nexus6的串行驱动程序(msm_serial_hs_lite.c)进行一些相对较小的更改,以支持KGDB (特别是执行原子字符I/O操作的能力)。我只是将这些修改从Linux内核主线代码移植到完整的MSM (高通)串行驱动程序msm_serial.c上,因为一个叫Stephen Boyd的家伙已经完成了艰苦的工作。他的更改可以是found here,也可以在谷歌上搜索"msm_serial: add support for poll_“。移植并不困难,我的代码可以是found on github

除此之外,您还需要能够为谷歌提供的lots of information on为您的N6构建自定义内核。然后,您需要创建一个引导映像,其中包含github存储库中的KGDB修改。我从https://developers.google.com/android/nexus/images获取了常用内核,将其解压缩(使用-x),然后使用以下命令将其与我的自定义内核(zImage-dtb)和其他命令行参数一起重新打包,以确保KGDB将被加载并指向我的串行端口,如下所示:

abootimg -u boot.img -k zImage-dtb -c 'cmdline=console=ttyHSL0,115200,n8 kgdboc=ttyHSL0,115200 kgdbretry=4'

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

echo -n g > /proc/sysrq-trigger

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

在手机挂起并连接调试电缆的情况下,在主机PC上启动用于ARM的GDB版本,并将未压缩的内核作为参数(例如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 ),然后就可以开始调试了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6697754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档