Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3650374
  • 博文数量: 880
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 6155
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-11 09:12
个人简介

To be a better coder

文章分类

全部博文(880)

文章存档

2022年(5)

2021年(60)

2020年(175)

2019年(207)

2018年(210)

2017年(142)

2016年(81)

分类: LINUX

2019-08-09 19:38:32

1,web页面打不开:查看进程,gdb挂进程,看他的调用栈,数据库未关闭,谁占用数据库,挂这个进程。分析代码。
2,core文件问题,进程挂掉,生成core文件,但gdb无法解析cannot access,core文件有问题,查看大小,设置ulimit 为unlimit
3,kgb汇编
最需要关心的是异常信息中的 epc 的值, 这个值就是发生异常的指令所在的地址.

打开kdb, id epc, 如 id 0x5fff7c14 , (注意要加0x). 这就得到异常指令的内容了. (厄, 显示的是汇编,
所以需要我们得知道汇编的一些基础知识, 但这就不讲了, 如有兴趣, 大家可以看万工写的"mips汇编
分析入门.ppt").

好了, 我们id出epc, 指令类似下面的(会显示很多行, 我们只看第一行):
0x5ecdbc5c l24_proc+0x38:    lw a0,23908(v0)
0x5ecdbc5c 就是epc, l24_proc+0x38是epc所在的函数的相对偏移地址, lw a0,23908(v0) 是epc的内容.

定位异常第一板斧:
很多的异常都是由空指针或非法指针造成的, 如何判断是非法指针呢? 我们看epc的内容(即那条汇编指令),
是否由指针操作, 如 23908(v0) 一类的, 就是取v0地址偏移23908字节的内存的值, 那么v0就是指针了.

然后我们看一下寄存器的v0的值(以前版本的异常信息寄存器都是$0 $24一类的, 可以在regdef.h中找其与
名字的对应关系), 然后看一下异常信息中的v0值, 若是 00000000 或 00000006 一类, 那么可以确定确实
是空指针(或非法指针)的问题了, 到相应的c代码里去找问题的答案吧, 能读懂汇编的同学, 可以耐心的推
一下v0是哪个局部变量.

那么假如epc没有指针操作呢, 这时候你可能想找老何了, 不过别急, 再看看嘛. 假如epc的那条指令是类似于
beqz或者jalr这样的跳转指令, 那么就看下一条指令是不是有指针操作. 这是因为跳转指令的执行时, 它
下一条指令会先执行完(别来问我为什么, 看"see mips run linux"去).
阅读(1753) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~