adb manual

###1. 使用tcp/ip网络连接adb adb能够通过tcp连接,将pc与android设备连接到同一个局域网中, 然后执行 /* step 1. 重启手机的 adbd, 并且 adbd 将会监听5555号tcp端口 */ $ adb tcpip 5555 /* step 2. 可建立 adb 连接, 假设手机的ip为 192.168.1.244 */ $ adb connect 192.168.1.244:5555 /* step 3. 检查 adb devices, 因为同时有usb和网络的连接, 所以一台手机会被识别为2个adb设备 */ $...

linux kernel debug 方法

###1. 内核调试选项 在编译内核的时候,为了方便调试和测试代码,内核提供了许多配置选项, 如 Page alloc debugging :CONFIG_DEBUG_PAGEALLOC 不使用该选项时,释放的内存页将从内核地址空间中移出。使用该选项后,内核推迟移 出内存页的过程,因此能够发现内存泄漏的错误。 Debug memory allocations :CONFIG_DEBUG_SLAB 该打开该选项时,在内核执行内存分配之前将执行多种类型检查,通过这些类型检查可 以发现诸如内核过量分配或者未初始化等错误。内核将会在每次分配内存前后时设置一些警戒值,如果这些值发生了变化那么内核就会知道内存已经被操作过并给出明确的提示,从而使各种隐晦的错误变得容易被跟踪。 Spinlock debugging :CONFIG_DEBUG_SPINLOCK 打开此选项时,内核将能够发现spinlock未初始化及各种其他的错误,能用于排除一些死锁引起的错误。 Sleep-inside-spinlock checking:CONFIG_DEBUG_SPINLOCK_SLEEP 打开该选项时,当spinlock的持有者要睡眠时会执行相应的检查。实际上即使调用者目前没有睡眠,而只是存在睡眠的可能性时也会给出提示。 Compile the kernel with debug info :CONFIG_DEBUG_INFO 打开该选项时,编译出的内核将会包含全部的调试信息,使用gdb时需要这些调试信息。 Stack utilization instrumentation :CONFIG_DEBUG_STACK_USAGE 该选项用于跟踪内核栈的溢出错误,一个内核栈溢出错误的明显的现象是产生oops错 误却没有列出系统的调用栈信息。该选项将使内核进行栈溢出检查,并使内核进行栈使用的统计。 Driver Core verbose...

linux dynamic debug

###1. dynamic debug linux kerne 的 dynamic debug 特性使得你能在系统运行时动态 打开/关闭 使用如下的内核消息打印接口 pr_debug() dev_dbg() print_hex_dump_debug() print_hex_dump_bytes() dev_dbg_ratelimited() pr_debug_ratelimited() 若编译的是debug版的kernel, 则pr_debug() dev_dbg() 都会被打开, 不能dynamic control dynamic debug 需要debugfs的支持, 在debugfs挂载后才能工作, 在编译内核时还需要打开”CONFIG_DYNAMIC_DEBUG”. ###2. 如何开关dynamic debug dynamic debug 使用”<debugfs>/dynamic_debug/control”属性(debugfs一般挂载在”/sys/kernel/debug”, 即为”/sys/kernel/debug/dynamic_debug/control”)来控制开关。 cat /sys/kernel/debug/dynamic_debug/control 能看到所有已经打开的dynamic debug消息, 例如:...

linux printk

###1. printk printk 是 linux kernel 中的 printf printk最大的优点是:你能在任何地方调用它–在中断上下文, 进程上下文, 持有锁的地方,在多处理器上。唯一不好的是,你必须要等到终端初始化好, printk才能工作(另外,在suspend的过程中, printk也会停止工作)。在终端和控制台被初始化之前printk的所有信息都被缓存在printk的简单的ring buffer(环形缓冲区)中,直到终端和控制台被初始化之后,所有缓存信息都被一并输出。 ###2. 当printk还没有开始工作时 如果你要调试的是启动过程最开始的部分(如setup_arch()),此时printk()还不可使用, 可以依靠此时能够工作的硬件设备(如串口)与外界通信,使用printk()的变体early_printk()函数。她在启动过程初期就具有在终端上打印的能力,功能与prink()类似,区别在于: 函数名 能够更早地工作(输出信息) 她有自己的小缓存(一般为512B) 一次性输出到硬件设备,不再以ring buffer的形式保留信息。 该函数在一些构架上无法实现,所以这种办法缺少可移植性。(大多数构架都可以,包括x86和arm)。 ###3. printk的缺点 这个函数的效率很低:做字符拷贝时一次只拷贝一个字节,且去调用console输出可能还产生中断。所以如果你的驱动在功能调试完成以后做性能测试或者发布的时候千万记得尽量减少printk输出,做到仅在出错时输出少量信息。 printk的临时缓存printk_buf只有1K,所有一次printk函数只能记录&lt1K的信息到log buffer ###4. printk的消息等级 printk和c库的printf功能基本相同,但是printk多了一个调试等级 printk(LEVEL "debug string\n"); 可选的debug level有 #define KERN_MERG "0"...

android image 文件

###1. boot.img & recovery.img boot.img 和 recovery.img 并不是一个完整的文件系统的镜像,而是android自定义的一种文件格式,从头至尾依次为: 1page大小的文件头 gzip压缩过的kernel.img(zImage,由vmlinux和解压程序组成) ramdisk内存盘(android采用的根文件系统) boot阶段stage 2的程序(可选的) 合并起来的boot.img会放到一个单独的分区中. 也就是说: boot.img = zImage + ramdisk.img recovery.img = zImage + recover-ramdisk.img(比正常的ramdisk.img多一些额外的资源) boot.img recovery.img的生成, mkbootimg工具(out/host/linux-x86/bin/mkbootimg, 源码位于 system/core/mkbootimg) 例如: $ mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz...