系统崩溃的分析和调试.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:19108035856(电话支持时间:9:00-19:00)。
System Crash Analysis and Debug 1.概述 * crash是指应用程序在操作系统上运行时,由于执行了非法操作,操作系统强制应用程序退出的现象,也就是我们经常说的“程序跑飞”或者“程序崩溃”,unix中称之为“段错误”(segmentation fault) * 在嵌入式C语言编程时,由于程序要自己进行内存管理以及操作指针,程序发生crash的问题很常见 * 本次将会讲述当程序发生crash时,crash分析和调试的基本原理、如何利用ISS系统提供的工具进行crash分析 2.原理 * 一个可执行程序在编译后会包含代码段、数据段、BSS段、堆和栈(参考下图),其中数据段用来存储初始值不为0的全局数据,BSS段用来存储初始值为0的全局数据,堆用于动态内存分配,栈用来实现函数调用以及存储局部变量 * 在函数调用之前,会把函数的返回地址保存在栈上,当crash发生后,能够从PC指针得到crash发生的具体函数,再借助于栈上返回地址,能够进一步得到函数的调用者是谁;像这样,一个函数一个函数地往上找出所有保存的返回地址值,就可以知道各个调用函数,这就是栈回溯的原理(相关分析crash的工具或patch都是基于这个原理) * 当应用程序发生crash时,会向操作系统发送SIGSEGV信号,OS可以把当前的栈信息保存到文件或输出至console,这样,我们就可以通过这些log来分析出crash发生的原因 * 在ISS中为了方便crash分析,我们开发出相应的utility(make a2f, make iss-dump) 实现对crash地址的自动分析,结合这些工具和source code就能一步步找到crash发生的原因 3.当system crash发生时,如何进行分析和调试? 比如,以下面的crash代码为例,说明如何一步步确定crash发生的代码位置: INT4 *pi4Test = NULL; *pi4Test = 10; 1)分析crash发生时,函数的调用关系,确定crash发生的函数 当crash发生时,记得保存crash发生的log,假定保存crash发生的log文件为crash_test.log, 在项目主目录执行: make a2f SL=/home/zhifu/test/crash_test.log 这里会调用相关的utility对crash_test.log中的地址信息进行分析,给出各个地址所对应的函数信息,保存在文件crash_test.log_parse.log中。 在该文件中注意到: > do_page_fault() #2: sending SIGSEGV to ISS.exe for invalid write access to(epc == 00ce6a48=>nmhGetCmLbdInterval , ra == 00ce7944=>CmLbdIntervalGet ) will dump memmap_pid: 38 因此,函数的调用关系如下: CmLbdIntervalGet >nmhGetCmLbdInterval 由此可知,crash发生在函数nmhGetCmLbdInterval中 2)进一步找到函数中crash发生的具体位置 从第1步中我们知道crash发生的函数,但是这个函数可能很大,我们必须精确定位到crash具体发生在哪一行,才能找到crash发生的根本原因。 根据crash发生函数的地址,在项目主目录执行: make iss-dump SA=0x00ce6a40 EA=0x00ce6a4f 这里会使用反汇编工具对0x00ce6a40到0x00ce6a4f(涵盖crash发生的地址)内的地址进行反汇编处理: zhifu@sw1-server:~/teg-30284$ make iss-dump SA=0x00ce6a40 EA=0x00ce6a4f /home/zhifu/teg-30284/core/code/future/LR/ISS.exe: file format elf32-tradbigmips Disassembly of section .text: 00ce6a40 <nmhGetCmLbdInterval+0x8>: store the Value requested in the Return val. Returns : SNMP_SUCCESS or SNMP_FAILURE ****************************************************************************/ INT1 nm

您可能关注的文档

文档评论(0)

130****1572 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

认证主体陈**

相关文档

相关课程推荐