在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → Coredump简介及使用

Coredump简介及使用

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:1.01M
  • 下载次数:5
  • 浏览次数:90
  • 发布时间:2021-01-17
  • 实例类别:一般编程问题
  • 发 布 人:好学IT男
  • 文件格式:.pdf
  • 所需积分:2
 

实例介绍

【实例简介】
Android Coredump简介及使用_v1.0_201504281025.pdf
Coredump简介及使用 什么是 Coredump 有些CC++程序或者通过JN调用了CC++的APK程序可以通过编译,但在运 行吋会岀现错误,比如常见的 signal11( SIGSEGⅥ),这样的程序都是可以通过编 译的,而且这样的错误一般情况下不会像编详错误一样告诉你具体在代码的那 行有问题,所以调试起来比较困难和麻烦。 因为上面的这种 debug困难的情况,所以就产生了 coredump这种机制(很 多操作系统都支持这种机制,并不是Lnux独有,也不是专门为 Android而生), 系统(或者标准库)在发现程序错误的异常退岀吋,就会把程序当吋整个进程的 状态dump出来,生成一个 coredump文件,通常情况下 coredump包含了程序 运行时的内存,寄存器状态,堆栈指针,内存管理信息等,可以理解为把程序 工作的当前状态存储成一个文件,很幸运,我们现在使用 Android系统是基于 Linux内核, Linux内核原生就支持这种机制 、 Coredump产生的原因 造成程序 coredump的原因很多,这里根据以往的经验总结一下 1、内存访问越界 由于使用错误的下标,导致数组访问越界 搜索字符串时,依靠字符串结束符来判断字符串是否结東,但是字符串没有正 常的使用结束符 使用 等字符串操作函数,将目标字 符串读写爆。应该使用 等函数防止读写越界 2、多线程程序使用了线程不安全的函数 第类:不保护共享变量的函数 第类:保持跨越多个调用的状态函数 第类:返回指向静态变量指针的函数 第类:调用线程不安全函数的函数 3、多线程读写的数据未加锁保护 个线程做完条件判断准备使用时发生了调度,另外一个线程将其释放 并置空或者修改了内容,就会导致程序执行流错乱,要么指针异常,要 么状态错乱发生另外的异常 非法指针 使用空指针 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配 为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结 构或类型的指针,而应该将这段内存拷贝到个这和结构或类型中,再访问 这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型 对齐的,那么访问它时就很容易因为 而 使用未初始化或者已经释放或者状态不明的野指针 5、堆栈溢出 不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出, SWD2-FRAEMWORK/VINCENT SONG/2015-04-27 16: 44/V1.0 Coredump简介及使用 破坏系统的栈和堆结构,导致出现莫名其妙的错误 如何控制产生 Coredump 直接修改 init.ro( system/core/ rootdin)文件,在 setrlimit134040后面添加: setrlimit 4-1 mkdir/data/coredump 0777 system system write/proc/ sys/kernel/core_pattern /data/ coredump/core. %e %p write/proc/sys/fs/suid dumpable 1 这些命令的目的是将 RLIMIT CORE的大小修改为 un limited,具体参见 keywords中 do setrlimit数。其中 RLIMIT CORE的定义在 Resource. h中。在 data目录下创建 coredump文件火,并给系统赋予可读可写权限。改写 coredump 文件的存储路径。使调用了 seteuid(/ setegid的程序能够生成 coredump,默认 情况下系统不会为这些进程生成 Coredump,需要设置suid_ dumpable为1 尽管是做了上面这些动作,但是仍然只能为 native程序产生 coredump,对 于由 zygote fork的apk进程则不会生成 coredump,因为 zygote在做初始化的时 候会忽略 Linux的配置,使用默认不生成 coredump的配置, system server同样 是由 zygote fork的,所以也不会广生 coredump,所以如果出现因为 system server 的 thread crash引起的重启则会非常头疼,需要为 system server配置生成 coredump,如果其他ak进程需要产生 coredump同样需要在开机初始化的时候 为 zygote做特殊的设置 所谓的特殊设置就是将 zygote的启动参数中应用 rlimit的配置, system server也是同样。 四、使用 Coredump的准备 通过设置在出问题时产生了 coredump,接下来我们就要使用这个 coredump 为我们分析具体的问题。工欲善其事必先利其器,我们首先要准备好解析 coredump的环境和工具 1、GDB,由于我们是分析嵌入式Lnux内核下的产生的 coredump,所以我 们需要专门的交叉编译工具链中的arm- linux-androideabi-gdb,大概位置: prebuilt/ gcc/linux-x86/arm/arm-linux-androideabi-4 8/bin/arm- linux-androide abi-gdb 2、有了GDB还不够,我们需要更加人性化、简单易操作的图形化工具一 Eclipse+CDT来香看 coredump 如何获得: a b、在ADT中更新你的CDT插件,help-》 install new software》 type url 3、准备与 coredump版本对应的源代码环境,最好与编译版本时的路径保 持一致,以便定位具体的代码 4、准备与 coredump版本对应的 symbols SWD2-FRAEMWORK/VINCENT SONG/2015-04-27 16: 44/V1.0 Coredump简介及使用 五、开始使用 Coredump 打开 Eclipse+CDT或者ADT,这里以 Eclipse+CDT为例,打开后的主界面如下 ● o Debug- Eclipse File Edit Navigate Search project Run window Help 0. QuickAccess最cC+ Debug t Debug a a(variables 24 o Breakpoints dii Registers a Modules 口outl An outline is not available Q console 2 Tasks Problems D Executables 0 No consoles to display at this time. Building workspace 然后点击Run-》 Debug Configurations,出现以下界面: a Debug Configurations Create, manage, and run configurations 自日静 Configure launch settings from this dialog ty file te C-Press the'New button to create a configura cC/C++ Application D-Press the'Duplicate' button to copy the sele +Attachto Applicati x-Press the'Delete' button to remove the sele aC/c++Postmortem Debu)+p-Press the Filter' button to configure filterin aet++Remote Applicatio Edit or view an existing configuration by sel e> Launch Group Configure launch perspective settings from the SWD2-FRAEMWORK/VINCENT SONG/2015-04-27 16: 44/V1.0 Coredump简介及使用 双击c/C++ Postmortem(验尸) Debug出现下面的界面: Name: New_configuration 因‖国Man、 Debugger i/ Source a common ication Lowe… ch to Applicatian C/C++Aaplcabian mortem Debugger /home/vincent. song/Downloads/out 6p/target/product/ido 347/symbols/syster duration variables. Search Project. Browse. ote Application Build(if required) before launching Build configuration: Use Active O Enable auto build O Disable auto build O Use workspace settings Configure Workspace Settings. Post Mortem file type Core file care file(leave blank arselect root directory to trigger prompt) /home/vincent. song/Downloads/out_b/lsystem binlapp_process.828 androi Browse.. of items Using GDB(DSF) Postmortem Debugger Launcher-Select other Apply eve 这里我们以32位的502L的 system server crash为例,由于 system server 是由 zygote fork出来的,而 zygote的主入口程序是 app process2,所以首先我 们需要在c/C++ Application一栏中点击 Browse找到app_ process32,我们在上面 的准备工作中说了要下载好与出问题版本对应的 symbols文件,这里就要用到, 带 symbols的 app_ prcoess32 的相对路径在 out/ target/ product/idol347/ symbols/ system/bin/ app processs2,选中它。 然后在 Post Mortem file type一栏中点击 Browse,选中你出问题时生成的 coredump文件。 上面的步骤完成之后,接下来点击TAB项中的 Debugger出现以下界面 Name: New configuration a Main*Debugge Source common Debugger Options Main shared Libraries GDB debugger: /local/build/ldol3-47-release/vA6P/prebuilt/gcc/linux./Browse (Warning: Some commands in this file may interfere with the startup operation of ua e GDB command file: /home/vincent. song/Downloads/out_b/gdbinit Brow debugger, for example"run.) SWD2-FRAEMWORK/VINCENT SONG/2015-04-27 16: 44/V1.0 6 Coredump简介及使用 在 GDB debugger一栏点击 Browse找到gdb,在源码目录中的相对路径是: prebuilt/gcc/linux-x86/arm/arm-linux -androideabi-48/bin/arm-linux-andro deabi-gdb 在 GDB command file一栏点击 Browse找到你的 abinit文件,这里说明 下这个文件时在gdb启动时默认读取命令的文件,所以你可以在这个文件中写 上你需要执行gdb命令,我这里写了两条供参考: set solib-absolute-prefix /home/vincent. song/Downloads/out_ep/target/product/idol347/symbols sct solib scarch path /home/vincent seng/WownlDads/out bp/target/product/ido134//symbols/systcm/lib 以上两条是帮助我们指定 symbols中soib的相对路径以及搜索路径,你还 可以设置其他命令,具体请参考 gdb debuge手册。 最后再点击TAB项中的 Source选择源码的路径,点击后出现以下界面: Name: New configuration D Main * Debugger i/ Source common Source Lookup Path e Default Edit Remove Down Restore Default Search for duplicate source files on the path Using GDB (DSF) Postmortem Debugger Launcher -Select other. Apply Revert t Absolute File path C Compilation Directory 参 File System Directory E Path Mapping E Program Relative File Path 2 Project a Project -Path Relative to Source Folders B Workspace e workspace Fold Cancel OK SWD2-FRAEMWORK/VINCENT SONG/2015-04-27 16: 44/V1.0 Coredump简介及使用 Add Source Add a con A directo s Add File System Directory File system folder k Absolut specify folder and whether subFolders should be searched C Comp Edit e File Sys Directory Remove 盛 Path M /local/build/ldol3-47-release/VAOP E Prograf B Project C Search subfolders. Down L Project tore Defaul e Worksp ncel Lancel IIU Search for duplicate source riles on the path Name: New configuration 目 Main** Debugger Source回 Common Source Lookup Path E VA6P-/Local/build/ldol3-47-release Add b E Default Edit Remove Down Restore default O Search for duplicate source files on the path Using GDB(DSF) Postmortem Debugger Launcher- Select other pply Revert Close Dug 按照上面的步骤设置好之后,并在第7步点击 Debug按钮之后,就会开始 加载,最后进入调试的主界面: SWD2-FRAEMWORK/VINCENT SONG/2015-04-27 16: 44/V1.0 8 Coredump简介及使用 090 Debug-/home /vincent, song/project/idols_0327173B/bioniclibc/bionic/dlmalloc. c-Eclipse File Fdit Source Refactor Navigate Search Project Run window Help ic 园c+ #F Debug 2? d s variabl i3 a Breakp bid Registe n Module F G New configuration (C/c++ Postmortem Debugger 日即其输世。 v雷 app process32 Type Value 7 uP Thread #1(Suspended: Container) void bionic heap usage error() at dIma lloc. c:46 0xb6F4a6b0 ◆ function const chart Oxb6f61 E dfree) at malloc.c: 4, 803 0xbGf4aGbC E free(l at malloc_ debug common. cpp: 251 Oxb6F30F2c E android: Streamingziplnfater: - Streamingzipinflatern) at streaming E android: CompressedAsset: getBuffer0)at Asset cppc 387 0xb6c56bB E android: AssetManager: SharedzipssetResourceTableAssetO at Assed E android: AssctManagcr ZipSct sctzipRcsourceTublcAssct)at Asscti android: AssetManager append PathToRes Table() at AssetManager cf E android: AssetManagere getRes Tablel)at AssetManager cpp: 733 0xb 口 Asset.cpp□ AssetManager, cpp□ dlmalloc. c 8 streamingzip. cpp address, function): 19 9// So that debugged gives us a memory dump arcund the specific address 191//ToDO: improve the cebuggerd protocol so we can tell it to dump an address when we abort 9 15 2*((int**) Oxdeadbaad y= (int*) address 193 I9 5 latic void named_anonymous_mmap(size_t length)t 曰 Console &3 Tasks图 Probtems o Executables Memory 画其|固回回日,-,口日 New_configuration(C/c++ Postmortem Debugger /locay/build/ldol3-4 7-release/vA6P/prebuilt/gcc/linux-x86/arm/arm-inux-androideabA-4 B/b Core was generated bys Program terminated with signal 11. Segmentation fault 我们可以看到主界面的布局,包括 Debug的 callstack, variable, source cdoe, console等,其中 Debug界面中显示的 callstack就是我们这个 coredump对应的 程序最后 crash的 callstack,我们可以逐层往上追溯,点击对应的调用项就可以 显示对应的源码,同时将鼠标放在对应的对象或者变量上就会显示出当时程序 运行状态下所对应的值,这样我们就可以重新还原程序出问题时的场景和上下 文,方便我们找到问题所在。 以上是一个基本使用的介绍,其他高级功能大家可以在以后的使用中不断 探索,如果发现也请共享给大家,谢谢! END OF DOCUMENT SWD2-FRAEMWORK/VINCENT SONG/2015-04-27 16: 44/V1.0 【实例截图】
【核心代码】

标签:

实例下载地址

Coredump简介及使用

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警