关于调试:调试中addr2line命令的使用。

问题引出:i850的wifi定位开启后,在使用goole maps时出现rootfs重启现象,打印的log信息如下:

//////////////////////////

I/DEBUG   ( 3411): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

I/DEBUG   ( 3411): Build fingerprint: 'PROWAVE/i850/i850/:Eclair/ECLAIR/eng.zhangjiejing.20100430.113200:eng/test-keys'

I/DEBUG   ( 3411): pid: 3436, tid: 3475  >>> system_server <<<

I/DEBUG   ( 3411): signal 11 (SIGSEGV), fault addr 00000000

I/DEBUG   ( 3411):  r0 26ba7eec  r1 403f3c49  r2 e98cf6f4  r3 405e58ae

I/DEBUG   ( 3411):  r4 00000000  r5 00000000  r6 4229b6cc  r7 48fecec8

I/DEBUG   ( 3411):  r8 490ecd84  r9 48feceb4  10 48fece9c  fp 00314d30

I/DEBUG   ( 3411):  ip ad3527cd  sp 490ecd68  lr ad3527eb  pc 00000000  cpsr 00000010

I//system/bin/dhcpcd( 3673): wlan0: looping

I//system/bin/dhcpcd( 3673): wlan0: signal_fd: 4,fd:5

I/ActivityManager( 3436): Starting activity: Intent { act=Android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/.Launcher }

D/LocationManager( 3777): removeUpdates: listener = P.a@43da64b8

I/DEBUG   ( 3411):          #00  pc 00000000

I/DEBUG   ( 3411):          #01  pc 000527e8  /system/lib/libandroid_runtime.so

I/DEBUG   ( 3411):          #02  pc 0000f1f4  /system/lib/libdvm.so

I/DEBUG   ( 3411):

I/DEBUG   ( 3411): code around lr:

I/DEBUG   ( 3411): ad3527d8 69e19806 694c9000 1c191c10 9b059a04

I/DEBUG   ( 3411): ad3527e8 b00247a0 46c0bd10 00017868 00006728

I/DEBUG   ( 3411): ad3527f8 4c0fb570 447c4d0f 6b2e1965 d1112e00

I/DEBUG   ( 3411):

I/DEBUG   ( 3411): stack:

I/DEBUG   ( 3411):     490ecd28  00000013

I/DEBUG   ( 3411):     490ecd2c  ad05f661  /system/lib/libdvm.so

I/DEBUG   ( 3411):     490ecd30  410c2aec  /dalvik-LinearAlloc (deleted)

I/DEBUG   ( 3411):     490ecd34  ad0560f7  /system/lib/libdvm.so

I/DEBUG   ( 3411):     490ecd38  400292d8  /mspace/dalvik-heap/zygote/0 (deleted)

I/DEBUG   ( 3411):     490ecd3c  410c2aec  /dalvik-LinearAlloc (deleted)

I/DEBUG   ( 3411):     490ecd40  000003dc

I/DEBUG   ( 3411):     490ecd44  ad0591f5  /system/lib/libdvm.so

I/DEBUG   ( 3411):     490ecd48  42200d44  /data/dalvik-cache/system@@classes.dex

I/DEBUG   ( 3411):     490ecd4c  42200d44  /data/dalvik-cache/system@@classes.dex

I/DEBUG   ( 3411):     490ecd50  4232b87d  /data/dalvik-cache/system@@classes.dex

I/DEBUG   ( 3411):     490ecd54  00000000

I/DEBUG   ( 3411):     490ecd58  4264aa04  /data/dalvik-cache/system@@classes.dex

I/DEBUG   ( 3411):     490ecd5c  410c1cbc  /dalvik-LinearAlloc (deleted)

I/DEBUG   ( 3411):     490ecd60  df002777

I/DEBUG   ( 3411):     490ecd64  e3a070ad

I/DEBUG   ( 3411): #01 490ecd68  43160000

I/DEBUG   ( 3411):     490ecd6c  ad05f661  /system/lib/libdvm.so

I/DEBUG   ( 3411):     490ecd70  490ecda8

I/DEBUG   ( 3411):     490ecd74  ad00f1f8  /system/lib/libdvm.so

W/ActivityManager( 3436): Activity pause timeout for HistoryRecord{43d6cd48 com.google.android.apps.maps/com.google.android.maps.MapsActivity}

wait for fb sleep Enter

D/WifiService( 3436): releaseWifiLockLocked: WifiLock{NetworkLocationProvider type=2 binder=android.os.Binder@43bfb998}

binder: release 3436:3560 transaction 22233 in, still active

binder: send failed reply for transaction 22233 to 3777:3777

I/DEBUG   ( 3411): debuggerd committing suicide to free the zombie!

I/DEBUG   ( 3855): debuggerd: Apr 14 2010 14:24:22

I/ServiceManager( 2066): service 'usagestats' died

I/ServiceManager( 2066): service 'account' died

//////////////////////////

注意到红色部分,这就是程序执行时的栈!显然第一个pc指针的值为0,也就是pc指针为空,这就是问题之所在,接下来就是要定位这个问题,上边说了,这里是程序执行时的栈,那么#01  pc 000527e8  /system/lib/libandroid_runtime.so   这个地址就是我们要找的问题的范围,因为显然是后者先入栈的,所以显然前者包含于后者,那么通过如下命令用地址定位一下源码的位置:

cpp@cpp:~/r7_0422$ ../gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-addr2line -e out/target/product/i850/symbols/system/lib/libandroid_runtime.so 000527e8

frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:397

cpp@cpp:~/r7_0422$

看到源码的397行是一个函数,那么000527e8就是这个函数的入口地址了。继而,pc 000000 对应的调用就应该在该函数内部,看到该函数内部只是做了对另一个函数指针的调用而已,所以我们可以断定这个函数指针的值为空,显然调用一个空的指针函数是错误的。所以需要给这个函数指针在早些时候赋值一下问题就可以解决了!

关于addr2line的一点补充:如果可执行文件中没有包括调试符号,您将获得??:0 作为响应。  还有在linux中的readelf命令可以读取可执行文件的相关信息,比如有一个可执行文件 aa.elf  则可以这么使用: readelf    -h      aa.elf 参数-h读取可执行文件的head信息。

参考连接:http://www.linuxidc.com/Linux/2011-05/35779.htm

V/AuthorDriver( 1006): Content is to be stored in Phone

I/DEBUG   (  667): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

I/DEBUG   (  667): Build fingerprint: 'luther/luther_demo/gliethttp/:2.2/FRG22D/eng.luther.20110119.100731:user/test-keys'

I/DEBUG   (  667): pid: 1006, tid: 1024  >>> /system/bin/mediaserver <<<

I/DEBUG   (  667): signal 11 (SIGSEGV), fault addr 0000000e

I/DEBUG   (  667):  r0 00000000  r1 0005a4a8  r2 0000000a  r3 0000000e

I/DEBUG   (  667):  r4 00057778  r5 0005a4a8  r6 0000000a  r7 40a2c9b0

I/DEBUG   (  667):  r8 00100000  r9 a811b865  10 4092d000  fp 00025c78

I/DEBUG   (  667):  ip a39c2a90  sp 40a2c970  lr a3932c71  pc afd1474a  cpsr 00000030

I/DEBUG   (  667):          #00  pc 0001474a  /system/lib/libc.so

I/DEBUG   (  667):          #01  pc 00032c6e  /system/lib/libopencore_common.so

I/DEBUG   (  667):          #02  pc 00031c9a  /system/lib/libopencore_common.so

I/DEBUG   (  667):          #03  pc 00032276  /system/lib/libopencore_common.so

I/DEBUG   (  667):          #04  pc 0006b77e  /system/lib/libopencore_common.so

I/DEBUG   (  667):          #05  pc 0003886c  /system/lib/libopencore_author.so

I/DEBUG   (  667):          #06  pc 00039c28  /system/lib/libopencore_author.so

I/DEBUG   (  667):          #07  pc 0002af22  /system/lib/libopencore_common.so

I/DEBUG   (  667):          #08  pc 0002b13c  /system/lib/libopencore_common.so

I/DEBUG   (  667):          #09  pc 0002b51e  /system/lib/libopencore_common.so

I/DEBUG   (  667):          #10  pc 00038476  /system/lib/libopencore_author.so

I/DEBUG   (  667):          #11  pc 000385b8  /system/lib/libopencore_author.so

I/DEBUG   (  667):          #12  pc 0001b8ca  /system/lib/libutils.so

I/DEBUG   (  667):          #13  pc 0001103c  /system/lib/libc.so

I/DEBUG   (  667):          #14  pc 00010b20  /system/lib/libc.so

I/DEBUG   (  667):

I/DEBUG   (  667): code around pc:

I/DEBUG   (  667): afd14728 99021c30 f7fa1c2a 1976ecb8 d1c62f00

I/DEBUG   (  667): afd14738 70342400 2600e001 98039603 bdf0b005

I/DEBUG   (  667): afd14748 5ec0230e 46c04770 4c0db510 4a0e4b0d

I/DEBUG   (  667): afd14758 18e3447c 1c1818a2 30cc327c 60132100

I/DEBUG   (  667): afd14768 60196059 3254330c d1f84283 58e04b07

I/DEBUG   (  667):

I/DEBUG   (  667): code around lr:

I/DEBUG   (  667): a3932c50 f7ef1c20 1c20ede6 46c0bd10 1c04b510

I/DEBUG   (  667): a3932c60 20016042 680b7220 680860e3 eec2f7ef

I/DEBUG   (  667): a3932c70 20006320 46c0bd10 1c04b510 280068c0

I/DEBUG   (  667): a3932c80 f7efd003 3001ef48 2001d102 bd104240

I/DEBUG   (  667): a3932c90 f7ef68e0 f7f0eeb0 e7f8e804 7d03b510

I/DEBUG   (  667):

I/DEBUG   (  667): stack:

I/DEBUG   (  667):     40a2c930  000013fc

I/DEBUG   (  667):     40a2c934  000001b8

I/DEBUG   (  667):     40a2c938  00100000

I/DEBUG   (  667):     40a2c93c  a811b865  /system/lib/libutils.so

I/DEBUG   (  667):     40a2c940  4092d000

I/DEBUG   (  667):     40a2c944  afd0be39  /system/lib/libc.so

I/DEBUG   (  667):     40a2c948  00000000

I/DEBUG   (  667):     40a2c94c  afd103f0  /system/lib/libc.so

I/DEBUG   (  667):     40a2c950  32321724

I/DEBUG   (  667):     40a2c954  6f5ef5ee

I/DEBUG   (  667):     40a2c958  00000000

I/DEBUG   (  667):     40a2c95c  afd103f0  /system/lib/libc.so

I/DEBUG   (  667):     40a2c960  00000003

I/DEBUG   (  667):     40a2c964  afd41724  /system/lib/libc.so

I/DEBUG   (  667):     40a2c968  df002777

I/DEBUG   (  667):     40a2c96c  e3a070ad

I/DEBUG   (  667): #01 40a2c970  000545b4  [heap]

I/DEBUG   (  667):     40a2c974  a3931c9f  /system/lib/libopencore_common.so

I/BootReceiver(  730): Copying /data/tombstones/tombstone_07 to DropBox (SYSTEM_TOMBSTONE)

[  428.915000] binder: release 1006:1014 transaction 3098 in, still active

[  428.922000] binder: send failed reply for transaction 3098 to 1023:1023

I/ServiceManager(  664): service 'media.audio_flinger' died

I/ServiceManager(  664): service 'media.player' died

I/ServiceManager(  664): service 'media.camera' died

I/ServiceManager(  664): service 'media.audio_policy' died

W/IMediaDeathNotifier( 1023): media server died

V/MediaRecorder( 1023): died

V/MediaRecorder( 1023): message received msg=1, ext1=100, ext2=0

W/AudioSystem(  730): AudioFlinger server died!

W/AudioSystem(  730): AudioPolicyService server died!

D/dalvikvm(  730): GC_FOR_MALLOC freed 1918 objects / 557832 bytes in 299ms

D/dalvikvm(  730): GC_FOR_MALLOC freed 206 objects / 322368 bytes in 264ms

I/        ( 1028): ServiceManager: 0xacd0

V/AudioHardwareInterface( 1028): Creating Vendor Specific AudioHardware

V/MediaPlayerService( 1028): MediaPlayerService created

I/CameraService( 1028): CameraService started: pid=1028

V/AudioPolicyService( 1028): Using hardware specific audio policy

V/AudioFlinger( 1028): registerClient() 0x1c7ac, tid 1028, calling tid 1028

V/AudioFlinger( 1028): Adding notification client 0x1c7b0

V/AudioFlinger( 1028): openOutput(), Device 2, SamplingRate 0, Format 0, Channels 0, flags 0

http://www.ibm.com/developerworks/cn/linux/l-graphvis/

使用 Addr2line 将函数地址解析为函数名

Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成更有意义的内容来说简直是太棒了。

要了解这个过程是怎样工作的,我们可以试验一个简单的交互式的例子。(我直接从 shell 中进行操作,因为这是最简单地展示这个过程的方法,如清单 4 所示。)这个示例 C 文件(test.c)是通过 cat 一个简单的应用程序实现的(也就是说,将标准输出的文本重定向到一个文件中)。然后使用 gcc 来编译这个文件,它会传递一些特殊的选项。首先,要(使用 -Wl 选项)通知链接器生成一个映像文件,并(使用 -g 选项)通知编译器生成调试符号。最终生成可执行文件 test。得到新的可执行应用程序之后,您就可以使用 grep 工具在映像文件中查找 main 来寻找它的地址了。使用这个地址和 Addr2line 工具,就可以判断出函数名(main)、源文件(/home/mtj/test/test.c)以及它在源文件中的行号(4)。

在调用 Addr2line 工具时,要使用 -e 选项来指定可执行映像是 test。通过使用 -f 选项,可以告诉工具输出函数名。清单 4. addr2line 的一个交互式例子

$ cat >> test.c

#include

int main()

{

printf("Hello World\n");

return 0;

}

$ gcc -Wl,-Map=test.map -g -o test test.c

$ grep main test.map

0x08048258 __libc_start_main@@GLIBC_2.0

0x08048258 main

$ addr2line 0x08048258 -e test -f

main

/home/mtj/test/test.c:4

$

linux 内核 addr2line,Android或Linux调试addr2line工具锁定命令的使用相关推荐

  1. Linux内核5.10编译 与调试

    Linux内核5.10编译 与调试 Linux 5.10 编译 下载内核 准备编译环境 配置模板 编译 安装新内核 qemu 调试 busybox 根文件系统制作 qemu 运行 脚本二 方法三 目的 ...

  2. 给大家推荐一个优质Linux内核技术公众号-Linux阅码场

    作为一个Linux 技术公众号的作者,我觉得有义务推荐优秀的公众号,推广内容,希望对大家的学习有所帮助~ Linux阅码场是一个专注Linux内核和系统编程与调试调优技术的公众号,它的文章云集了国内众 ...

  3. linux LTP移植Android,LTP(Linux Test Project) for Android的编译

    Linux Test Project (GitHub首页在此)(以下简称LTP) 包含了Linux内核和内核相关特性的工具集合.该工具的目的是通过把测试自动化引入到Linux内核测试,提高Linux的 ...

  4. linux内核培训广州,嵌入式Linux驱动开发高级培训班-华清远见嵌入式培训中心

    课程目标 本课程以案例教学为主,系统地介绍Linux下有关FrameBuffer.MMC卡.USB设备的驱动程序开发.参加本课程学习的学员,因为具备了Linux设备驱动开发基础,所以本课程针对性较强, ...

  5. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  6. Linux内核开发_1_编译LInux内核

    目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. ...

  7. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  8. 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )

    文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...

  9. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  10. 一文了解linux内核,一文了解Linux的系统结构

    什么是 Linux ? 如果你以前从未接触过Linux,可能就不清楚为什么会有这么多不同的Linux发行版.在查看Linux软件包时,你肯定被发行版.LiveCD和GNU之类的术语搞晕过.初次进入Li ...

最新文章

  1. MATLAB中设置figure的边框
  2. 切糕(bzoj 3144)
  3. boost::fusion::traits用法的测试程序
  4. 用户注册 - 判断用户名存在
  5. 学excel还是学python_已经会Excel了还需要学python吗?
  6. 杭州python靠谱吗_杭州Python高薪就业靠谱吗?
  7. 2013/12/25
  8. 橘子无法启动计算机丢失,《战地1》橘子平台无法启动 橘子意料之外的问题解决方法...
  9. 一个简单的小程序demo
  10. 拆弹实验-phase_2
  11. 物联网产业链全景图(附另13大电子行业全景图,必收藏)
  12. WinDirStat下载使用指南,处理电脑空间神器
  13. 阿里技术专家楚衡:架构制图的工具与方法论
  14. 乌镇时间到,创宇云端安全治理体系即将亮相世界互联网大会
  15. 云和恩墨新晋ACED熊军微信大讲堂主题分享
  16. 戴尔笔记本重装系统找不到硬盘怎么办?
  17. java pdfbox 转jpg_java实现PDF转图片的方法
  18. 有关直方图的常用操作
  19. 如何用cmd命令进入mysql
  20. 密码算法测试向量——HMAC-SHA系列

热门文章

  1. Android性能测试初谈--内存分析(金阳光)
  2. 【无标题】后来,我认为王阳明比尼采,叔本华都高明
  3. 蔡琴“银色月光下”南京新年演唱会何不来一场完美的追忆?
  4. Java中retainAll方法使用
  5. 动手实现一遍Transformer
  6. 在报酬与体验之间触碰到玩家“G”点才是元宇宙链游发展之道
  7. iPhone,iPad在国外如何看国内视频网站
  8. 2022.08.10 走过的一瞬间风景,即美也有诗意,给大家分享一下。
  9. 浅谈Metaspace内存溢出原因及JVM参数设置
  10. 【技巧总结】java位运算