九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 4419|回复: 0
打印 上一主题 下一主题

Android strace调试

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-6 09:42:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

出于某种原因,共享库的本地测试程序在SDK 1.0 R2版本中能顺利运行,但是在1.5 R2中无法加载。

        出于某种原因,共享库的本地测试程序在SDK 1。0 R2版本中能顺利运行,但是在1。5 R2中无法加载。由输出我们可以得到一个线索:文件bionic/linker/linker。c:1581无法加载库。对于这种情况,有一个简单易用的Linux工具(strace)可以提供帮助。

  strace工具会运行指定的命令,直到退出。它将截获并记录进程执行的系统调用以及进程接收的信号。每个系统调用的名称、其参数以及返回值都将输出。这是一个很有用的诊断和调试工具,在没有提供源代码的情况下,可以利用这个工具解决程序中出现的问题。你会发现,即使是正常程序,也能通过跟踪来了解系统及其系统调用的大量信息。

[java]
$ adb push strace /data
$ adb shell
# cd /data
# ./strace ./testlib
execve("./testlib", ["./testlib"], [/* 10 vars */]) = 0
getpid() = 835
gettid() = 835
sigaction(SIGILL, {0xb0001a99, [], SA_RESTART}, {SIG_DFL}, 0) = 0
sigaction(SIGABRT, {0xb0001a99, [], SA_RESTART}, {SIG_DFL}, 0) = 0
sigaction(SIGBUS, {0xb0001a99, [], SA_RESTART}, {SIG_DFL}, 0) = 0
stat64("/system/lib/libch02.so", 0xbef9ea58) = -1 ENOENT (No such file or directory)
stat64("/lib/libch02.so", 0xbef9ea58) = -1 ENOENT (No such file or directory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40000000
mprotect(0x40000000, 4096, PROT_READ) = 0
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 1), ...}) = 0
brk(0) = 0x11000
brk(0x11000) = 0x11000
brk(0x12000) = 0x12000
mprotect(0x40000000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x40000000, 4096, PROT_READ) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(1, "bionic/linker/linker.c:1581| ERR"..., 70bionic/linker/linker.c:1581| ERROR: 835
could not load 'libch02.so' ) = 70
write(1, "bionic/linker/linker.c:1641| ERR"...,
61bionic/linker/linker.c:1641| ERROR: failed to link ./testlib ) = 61
write(1, "bionic/linker/linker.c:1741| ERR"..., 71bionic/linker/linker.c:1741| ERROR: CANNOT LINK EXECUTABLE './testlib' ) = 71 exit_group(-1) = ?
Process 835 detached

[/java]

         下面这两行对问题源由给出了一条线索:


[java]
stat64("/system/lib/libch02.so", 0xbef9ea58) =-1
ENOENT (No such file or directory)
stat64("/lib/libch02.so", 0xbef9ea58) = -1
ENOENT (No such file or directory)

[/java]

         链接器首先尝试从设备的/system/lib文件夹打开库。这是一个只读的文件系统,用户定义的库无法保存在这里。接下来,链接器搜索/lib文件夹,这个文件夹不存在,所以链接失败。链接器并没有在当前目录中搜索,问题就出在这里!

        好在,这个问题不会妨碍在Java应用中加载库(只要其中没有缺少符号)。
        如果在SKD 1.0 R2中运行同样的命令序列,可以看到第二行变成:

[java]

stat64("./libch02.so", 0xbef9ea58) = 0 OK
[/java]


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-6-1 15:42 , Processed in 0.019366 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表