80,350
社区成员
发帖
与我相关
我的任务
分享
如果要调试已经在运行的daemon进程:
先用ps命令找出你的进程的进程号,例如你的程序叫mydaemon则可以这样:
ps -ef|grep mydaemon
然后就可以用gdb来对这个进程进行调试了,假设mydaemon在当前目录下,则:
gdb ./mydaemon pid
也可以先进入gdb然后用gdb的attach名利把这个进程加载近来。
如果进程还没有运行则可以直接用gdb来运行也可以:
gdb ./mydaemon
然后设置断点,然后run
还有一个常用的办法就是用strace
strace -p pid
这个办法有时候用来检查一些错误很有效。
目前android2.2 和android2.3上的prebuilt gdbserver一执行就会报错segmentfault,prebuilt的gdbserver是静态编译的,这样做是为了让gdb能跨android的各个版本使用,但这个做法并没有考虑到kernel和libc的多样性。所以就出现了segment fault。 从android issue上看到这样的解决办法,具体做法就从git上下载gdb的代码然后重新编译
# gdbserver :5039 /sytem/bin/MAP100Gps
gdbserver :5039 /sytem/bin/MAP100Gps
[1] Segmentation fault gdbserver :5039 /sytem/bin/MAP100Gps
#
很多网友不清楚Android NDK使用C/C++开发的应用,其实在Linux下调试我们主要使用GDB调试。当然使用Logcat或自己写入文件的方式调试也是可以的。有关Log打印可以参考Android开发网早期文章。今天Android123分享下GDB调试。
对于使用NDK编译出来的工具除了so库文件外,会会有gdbserver和gdb.setup文件,方法为
1. 在PC的命令提示符下进入ndk根目录,执行ndk-build NDK_DEBUG=1 这样,将会强制生成debug调试版的文件,将设我们NDK工程名为 cwj-test ,这里要说明的是编译出来的库文件在libs目录下是没有符号的,我们要obj下的文件,否则symbol无法正确加载。
2. 我们将生成的gdbserver和so库文件复制到/data目录下面,使用adb push命令,或者直接使用Eclipse中DDMS的File Explorer手动复制,不过对于真机可能没有这个列举目录的权限,你可以使用Android模拟器。
3. 进入Android手机或模拟器的命令行,我们使用adb shell命令,接下来进入刚才的文件夹,比如说adb shell /data/gdbserver 10.0.0.2:1987 ./cwj-test 这句你的手机ip假设为10.0.0.2端口号为1987,工程名为cwj-test 如果没有问题的话,会看到Listening on port 1987 这代表正在监听。
4. 接下来在新开一个PC命令行,这里Android123使用的是NDKr6,在 android-ndk-r6\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\bin\arm-linux-androideabi-gdb.exe ./cwj-test 执行
5. (gdb) target remote 10.0.0.2:1234 调试了,这里的ip和端口要和上面的对应,当然本机的ip你可以使用localhost代替。