关于android开发所需linux基础几个要点

参见《unix环境高级编程》
1.# strace ./app
execve("./app", ["./app"], [/* 47 vars */]) = 0
brk(0)                                  = 0x9f4e000
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=90922, ...}) = 0
mmap2(NULL, 90922, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb78de000
close(3)                                = 0
open("/lib/tls/i686/sse2/cmov/libshare.so", O_RDONLY) = -1 ENOENT (No such file or directory)
………………………..
writev(2, [{"./app", 5},{"libshare.so", 11}cannot open shared object file: No such file or directory
) = 116
exit_group(127)                         = ?
******  说明  **********
***strace ./app    1. 会打印反馈出./app每一步系统调用的信息。
               2.找出第一个出现问题的地方 open("/lib/tls/i686/sse2/cmov/libshare.so", O_RDONLY) = -1 ENOENT (No such file or directory)
2.程序默认关于共享库在ld.so.cache里搜索(通过ld.so.conf来配置) ,然后用ldconfig 命令生效
3.编译报undefined refrence to XXX
share_lib.c:
extern int my_add(int, int);

int add(int a, int b)
{

    return my_add(a , b);
}
#gcc -shared -fPIC share_lib.c -o libshare.so
#nm libshare.so|grep add
0000045c T add
         U my_add
#gcc -c share_lib.c -o libshare.o
#nm libshare.o
00000000 T add
         U my_add
解决办法:
找到该函数或变量的实现所对应的目标文件
在出错的目标文件的编译语句里是否有把1中的目标文件链接进来
**** 说明 *****
**用命令nm libshare.so|grep add 
**可以看libshare.so里面的add函数以及其里面的函数有没有被定义  如果定义用T  没有用U
**所以如果报undefined refrence to XXX  首先得着该函数所在的库 然后定位 在哪个函数.
4 关于makefile 命令必须是一个tab键 而不是空格.
5 关于core的一个总结(为何要产生core文件)
开启core机制--->  ulimit -c unlimited
分析core文件
$gdb test core_file
(gdb)bt
#0 0x08048380 in wib (no1=8, no2=8) at test.c :7
#1 0x080483dc in main(argc=1, argv=0xbfb383f4) at test.c:19
****说明bt为backtrace 为程序异常的最后的函数调用栈. bt会给你提示参数信息和 对应函数的位置.
6 android gdb远程调试
进入target终端并在其上执行:
#adb shell
#gdbserver remote:1234 --attach 69  (1234是端口,69是要调试的进程pid)

在host上
 #rm out/target/product/qsd8k_s7/symbols/system/lib/libicuuc.so
 #rm out/target/product/qsd8k_s7/symbols/system/lib/libssl.so
 #./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gdb out/target/product/qsd8k_s7/symbols/system/bin/mediaserver
  (gdb) set solib-absolute-prefix /<path>/android/out/target/product/qsd8k_s7/symbols/system/lib/
  (gdb) set solib-search-path out/target/product/qsd8k_s7/symbols/system/lib/
  (gdb) target remote 10.167.17.237:1234  注:10.167.17.223是target ip
  如命令执行完,需continue
  (gdb)continue
  出现错误,用backtrace查看
  (gdb)bt
***说明:mediaserver 就是进城ID为69 ..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值