您的位置:首页 > 运维架构 > Linux

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

2011-06-09 18:30 381 查看
参见《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 ..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: