Crash Error Debugging
这些天在根据游戏后台的崩溃信息对有游戏进行调试,刚开始调试的时候方向还不是很明确,多调试几次后也摸索出来了一些规律,这里简单地对网上的一些资料做个总结,后面也会持续更新。
SIGBUS和SIGSEGV也许是我们在平时遇到的次数最多的两个 内存错误 信号。
一、SIGSEGV
Official Description:
SIGSEGV --- Segment Fault. The possible case of your encountering this error are:
1.buffer overflow --- usually caused by a pointer reference out of range.
2.stack overflow --- please keep in mind that the default stack size is 8192K.
3.illegal file access --- file operations are forbidden on our judge system.
SIGSEGV(Segment fault):指针对应的地址是无效地址,没有物理内存对应该地址。
二、SIGBUS
SIGBUS(Bus error):指针对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问导致的。
SIGBUS的缺省行为是终止当前进程并产生core dump。
可能导致的原因:
(1)硬件故障;
(2)Linux平台执行malloc(),如果没有足够的RAM,Linux不是让malloc()失败返回,而是向当前进程分发SIGBUS信号;
(3)某些架构上访问数据时有对齐的要求,比如只能从4字节边界上读取一个4字节的数据类型。IA-32架构没有硬性对齐要求,尽管未对齐的访问降低执行效率。另外一些架构,比如SPARC、m68k,要求对齐访问,否则向当前进程分发SIGBUG信号。
测试表明,在x86/Linux、x86/Solaris、SPARC/Solaris平台上,越过栈底的地址访
问导致SIGSEGV信号。在x86/FreeBSD、x86/NetBSD、x86/OpenBSD平台上,越过栈底
的地址访问导致SIGBUS信号,而不是SIGSEGV信号。
三、SIGILL
SIGILL 信号是cpu在发现非法指令之后发出一个异常,然后由负责处理该异常的内核的ISR对含有这个非法指令的进程发出的。程序收到这个信号,一般就是报 告 illegal instruction 错误信息。
可能导致的原因:
(1)版本不一致, 比如依赖的共享库接口变了,但你仍在使用老版本的库,问题的现象通常是诡异,而且你觉得不可能挂的地方,而通常是挂在你对依赖库的调用之处。简单点说就是头文件更新了,但库文件还没有更新。
--------------------------------------------------------------------------
使用映射可能涉及到如下信号
SIGSEGV
试图对只读映射区域进行写操作
SIGBUS
试图访问一块无文件内容对应的内存区域,比如超过文件尾的内存区域,或者以
前有文件内容对应,现在为另一进程截断过的内存区域。
--------------------------------------------------------------------------
Signal | Description |
SIGABRT | 由调用abort函数产生,进程非正常退出 |
SIGALRM | 用alarm函数设置的timer超时或setitimer函数设置的interval timer超时 |
SIGBUS | 某种特定的硬件异常,通常由内存访问引起 |
SIGCANCEL | 由Solaris Thread Library内部使用,通常不会使用 |
SIGCHLD | 进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略 |
SIGCONT | 当被stop的进程恢复运行的时候,自动发送 |
SIGEMT | 和实现相关的硬件异常 |
SIGFPE | 数学相关的异常,如被0除,浮点溢出,等等 |
SIGFREEZE | Solaris专用,Hiberate或者Suspended时候发送 |
SIGHUP | 发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送 |
SIGILL | 非法指令异常 |
SIGINFO | BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程 |
SIGINT | 由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程 |
SIGIO | 异步IO事件 |
SIGIOT | 实现相关的硬件异常,一般对应SIGABRT |
SIGKILL | 无法处理和忽略。中止某个进程 |
SIGLWP | 由Solaris Thread Libray内部使用 |
SIGPIPE | 在reader中止之后写Pipe的时候发送 |
SIGPOLL | 当某个事件发送给Pollable Device的时候发送 |
SIGPROF | Setitimer指定的Profiling Interval Timer所产生 |
SIGPWR | 和系统相关。和UPS相关。 |
SIGQUIT | 输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程 |
SIGSEGV | 非法内存访问 |
SIGSTKFLT | Linux专用,数学协处理器的栈异常 |
SIGSTOP | 中止进程。无法处理和忽略。 |
SIGSYS | 非法系统调用 |
SIGTERM | 请求中止进程,kill命令缺省发送 |
SIGTHAW | Solaris专用,从Suspend恢复时候发送 |
SIGTRAP | 实现相关的硬件异常。一般是调试异常 |
SIGTSTP | Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程 |
SIGTTIN | 当Background Group的进程尝试读取Terminal的时候发送 |
SIGTTOU | 当Background Group的进程尝试写Terminal的时候发送 |
SIGURG | 当out-of-band data接收的时候可能发送 |
SIGUSR1 | 用户自定义signal 1 |
SIGUSR2 | 用户自定义signal 2 |
SIGVTALRM | setitimer函数设置的Virtual Interval Timer超时的时候 |
SIGWAITING | Solaris Thread Library内部实现专用 |
SIGWINCH | 当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程 |
SIGXCPU | 当CPU时间限制超时的时候 |
SIGXFSZ | 进程超过文件大小限制 |
SIGXRES | Solaris专用,进程超过资源限制的时候发送 |
Crash Error Debugging相关推荐
- 一个suse11 sp1的crash工具版本问题
这几年排查的各种类型的crash也比较多了,各种类型的也算见过,但是排查这个crash,走了不该走的弯路,事后显得很low,为了防止自己犯类似错误,也同时提醒后人,记录之. 内核是suse11,sp1 ...
- Android LiveData crash: Cannot add the same observer with different lifecycles
参考 Android lifecycle library: Cannot add the same observer with different lifecycles 项目场景: 最近项目的直播间中 ...
- ICE kinematics! - Softimage 2011!
XSI WIKI上的新特性介绍(纯文本,内容详细) The Area论坛官方发布帖(含视频,文档内容不含细节) 尽管还没有发售,但几项新特性已经足够让人侧目. ICE kinematics就是一个千呼 ...
- SQL 错误: ORA-00600: 内部错误代码, 参数: [qcsfbdnp:1], [], [], [], []
call CREATEZHIBIAOPART2('cy_prop_reason','2014-02-18','PropReason');commit;call CY_ALL_GAOJINSHUCHU( ...
- 虚幻引擎 4.14 版发布!
Share on Facebook Share on Twitter Share on Google+ Share on LinkedIn 此版包含 Epic 的数百项更新,以及 GitHub 虚幻引 ...
- 系统诊断概述-如何通过windbg来dump特定process的memory.
关键字:系统异常system exception 内存dump (信息转储),windbg工具. 1.为什么需要dump 内存 系统经常出现各种各样的问题,这些问题,可能是本身程序设计的时候 ...
- lambda函数,函数符_为什么您永远不应该在Lambda函数中使用print()
lambda函数,函数符 两个Lambda用户的故事 (A Tale of Two Lambda Users) 故事1:业余 (Tale #1: The Amateur) One moment eve ...
- aix linux运维,运维老司机分享的八个AIX日常运维经验及案例
原文来自微信公众号:AIX专家俱乐部 [经验分享]在AIX启动时,打开debug模式 经常遇到aix无法启动,但又不知道pending在哪,因此打开启动过程的debug模式,对于诊断问题有很大的帮帮助 ...
- 使用React的static方法实现同构以及同构的常见问题
代码地址请在github查看,假设有新内容.我会定时更新.也欢迎您star,issue,共同进步 1.我们服务端渲染数据从何而来 1.1 怎样写出同构的组件 服务端生成HTML结构有时候并不完好.有时 ...
最新文章
- 判断手机是否弹出键盘,改变了手机页面高度,对应inputStatus的状态改变相关控件的大小和位置
- skiplist跳表的 实现
- javascript的时间段选择
- matplotlib学习记录 四
- ElasticSearch入门 附.Net Core例子
- 随机森林算法 python_Python实现的随机森林算法与简单总结
- java emf 转jpg_java – emf到jpg的转换
- linux系统的文件系统tmpfs,linux里tmpfs文件系统
- torch.index_select与torch.gather
- c#excel导入mysql_(转)C# Excel导入Access数据库的源码
- linux 安装 PHP fileinfo 扩展
- lnmp、lamp、lnmpa一键安装包(Updated: 2021-01-06)
- Android 客户端上开发人人客户端系列教程
- lol选英雄显示服务器,lol卡在选人界面怎么回事 lol卡在选英雄界面怎么办
- Rasterio入门
- 【 第一章:初识 ts】
- flutter APP自动更新
- 图像(层)正常混合模式详解(上)
- 高清视频体验大幅提升,来数数我们应用了哪些新算法
- C初阶必写的C语言小游戏—扫雷,一看就会,看完就能写