WebKit技巧:如何用GDB进行调试 详细�0�3
1个回答
展开全部
何时用到GDB 来调试 个人认为,并不是所有问题都立马上GDB 来调试。因为Webkit 的代码十分巨大逻辑也十分的复杂,所以直接用GDB,可能不是很直观,你无法在合理的位置设置断点,单步跟踪更是会让人崩溃,因为逻辑很复杂,有些函数不止一次被调用,再加上多态,使得你很难准确定位问题。我们调试的目的就是为了跟踪流程和准确的定位问题。所以通常的做法是先通过经验和Log 把问题确定在一定范围之内,比如一个类之中,或者一个方法之中,然后再用GDB 去仔细调试。所以,用到GDB 调试的时候是: 1. 熟悉流程 2. 可以确定一定的代码范围 调试的原理 这里并不是讲GDB 是如何实现的,而是大致讲讲用GDB 调试手机库的原理。因为库是运行在手机里的,而开发环境是在PC 上的,所以并不是像PC上那样直接去调试,而是要用到GDB Server 和GDB Client,以及编译出来的带有Symbol 调试信息的库,才可以。这个调试所用的库(out/target/product/common/symbols/system/lib/libwebcore.so)有几 百兆大小,而手机中运行的库 (out/target/product/common/system/lib/libwebcore.so)才3M 多。 先是要把手机Browser 进程关联到一个端口,再通过adb forward 命令把手机的端口与PC的端口相映射,因为PC上的GDB与手机中的GDB Server 就是通过这个端口来通信的。手机中运行gdbserver,它会与手机Browser 进程通信,也就是与真正的库交互,而PC 端运行GDB 与带有调试信息的库交互,PC 的GDB 再通过端口与手机 中的GDB Server 通信,这样我们就能够在PC 上调试手机中的库了。 具体的设置步骤 首先,你需要一个已经编译好的Android 源码及其编译输出的各种二进制文件,关于Android 源码的获取和编译可以去Google。 映射端口,在PC 的Shell 中运行 [plain] view plaincopyprint? 1. adb forward tcp:5039 tcp:5039 设置手机和GDB Server,打开手机Browser,进入adb shell,用ps 命令找到Browser 的pid,然后运行 [plain] view plaincopyprint? 1. gdbserver :5039 --attach pid 设置PC GDB,要运行源码下的GDB 文件 [html] view plaincopyprint? 1. mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gdb mydroid /out/target/product/generic/system/bin/app_process 之后,会进行GDB 的提示符下面,先加载所要调试的库: [plain] view plaincopyprint? 1. set solib-absolute-prefix mydroid/out/target/product/generic/symbols 2. set solib-search-path mydroid/out/target/product/generic/symbols/system/lib 然后开始调试 [plain] view plaincopyprint? 1. target remote :5039 之后就可以用GDB 命令去调试了。 每次调试,gdbserver 都要重新设置,因为每次PID 都会不一样,而gdb client 端刚不需要重复。 为了简化流程,对于gdbserver 的设置可以用Shell 脚本来做,如下: [plain] view plaincopyprint? 1. #!/bin/bash 2. 3. cd /work/mydroid 4. ADB=./out/host/linux-x86/bin/adb 5. $ADB forward tcp:5039 tcp:5039 6. $ADB shell am start -n com.android.browser/.BrowserActivity 7. TMPFILE=tmp.txt 8. $ADB shell ps > $TMPFILE 9. #echo "tmp file is $TMPFILE"; 10. while read user pid line; 11. do 12. #echo $line; 13. if [[ $line == *browser* ]]; then 14. echo "pid of browser is $pid"; 15. browser_pid=$pid; 16. fi 17. done < $TMPFILE 18. rm -f $TMPFILE; 19. $ADB shell gdbserver :5039 --attach $browser_pid 可以把这段脚本保存为gdbserver.sh,把其中的路径更换为相应的源码路径即可。每次调试前先运行一次gdbserver.sh,手机端就设置好了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询