关于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 ..
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 ..
相关文章推荐
- java基础知识要点总结之几个重要关键字(关于static、this、final、)
- 关于php开发中的字符编码问题总结的几个要点
- 学习android驱动开发必须记住的几个linux 命令
- 跟我一起玩Win32开发(1):关于C++的几个要点
- 关于PHP开发的几个安全要点
- 跟我一起玩Win32开发(1):关于C++的几个要点
- Android关于百度地图开发的几个常用方法
- Android开发——关于Service的一些要点
- 【Android开发】Android Service完全解析,关于服务你所需知道的一切(上)--(附源码可供下载)
- android开发学习---linux下开发环境的搭建&& android基础知识介绍
- 跟我一起玩Win32开发(1):关于C++的几个要点
- Android开发基础要点
- Mars老师的Android学习基本路线Linux、数据库、网络协议、服务器端开发知识基础知识
- android 开发 关于地图的几个概念
- 转贴一个好的文章,关于android开发环境在Linux(fedora14)
- 关于进行java学习和Android开发,本人认为的一些基础的入门必需知识,全程手敲
- 关于linux下C++开发的几个注意事项
- Mars老师的Android学习基本路线Linux、数据库、网络协议、服务器端开发知识基础知识
- 关于php开发中的字符编码问题总结的几个要点
- 关于eclipse下开发android应用的几个常用插件