电玩网站lol安装java进程异常退出出

博客访问: 196066
博文数量: 401
博客积分: 0
博客等级: 民兵
技术积分: 14
注册时间:
嵌入式屌丝
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
原文地址: 作者:
&进程退出意味着进程生命期的结束,系统资源被回收,进程从操作系统环境中销毁。进程异常退出是进程在运行过程中被意外终止,从而导致进程本来应该继续执行的任务无法完成。
首先我们来看导致进程异常退出的这两类情况:
●第一类:向进程发送信号导致进程异常退出;
●第二类:代码错误导致进程运行时异常退出。
第一类:向进程发送信号导致进程异常退出
UNIX 系统中的信号是系统响应某些状况而产生的事件,是进程间通信的一种方式。信号可以由一个进程发送给另外进程,也可以由核发送给进程。
信号处理程序:
信号处理程序是进程在接收到信号后,系统对信号的响应。根据具体信号的涵义,相应的默认信号处理程序会采取不同的信号处理方式:
●终止进程运行,并且产生 core dump 文件。
●终止进程运行。
●忽略信号,进程继续执行。
●暂停进程运行。
●如果进程已被暂停,重新调度进程继续执行。
前两种方式会导致进程异常退出,是本文讨论的范围。实际上,大多数默认信号处理程序都会终止进程的运行。
在进程接收到信号后,如果进程已经绑定自定义的信号处理程序,进程会在用户态执行自定义的信号处理程序;反之,内核会执行默认信号程序终止进程运行,导致进程异常退出。
图1.默认信号处理程序终止进程运行
所以,通过向进程发送信号可以触发默认信号处理程序,默认信号处理程序终止进程运行。在 UNIX 环境中我们有三种方式将信号发送给目标进程,导致进程异常退出。
方式一:调用函数 kill() 发送信号
我们可以调用函数 kill(pid_t pid, int sig) 向进程 ID 为 pid 的进程发送信号 sig。这个函数的原型是:
&int kill(pid_t pid, int sig);
调用函数 kill() 后,进程进入内核态向目标进程发送指定信号;目标进程在接收到信号后,默认信号处理程序被调用,进程异常退出。
清单 1. 调用 kill() 函数发送信号
/* sendSignal.c, send the signal ‘ SIGSEGV ’ to specific process*/
&int main(int argc, char* argv[])
&char* pid = argv[1];
&int PID = atoi(pid);
kill(PID, SIGSEGV);
&return 0;
上面的代码片段演示了如何调用 kill() 函数向指定进程发送 SIGSEGV 信号。编译并且运行程序:
[root@machine ~]# gcc -o sendSignal sendSignal.c
&[root@machine ~]# top &
&[1] 22055
&[root@machine ~]# ./sendSignal 22055
&[1]+ Stopped top
&[root@machine ~]# fg %1
&Segmentation fault (core dumped)
上面的操作中,我们在后台运行 top,进程 ID 是 22055,然后运行 sendSignal 向它发送 SIGSEGV 信号,导致 top 进程异常退出,产生 core dump 文件。
方式二:运行 kill 命令发送信号
用户可以在命令模式下运行 kill 命令向目标进程发送信号,格式为:
kill SIG*** PID
在运行 kill 命令发送信号后,目标进程会异常退出。这也是系统管理员终结某个进程的最常用方法,类似于在 Windows 平台通过任务管理器杀死某个进程。
在实现上,kill 命令也是调用 kill 系统调用函数来发送信号。所以本质上,方式一和方式二是一样的。
操作演示如下:
[root@machine ~]# top &
&[1] 22810
&[root@machine ~]# kill -SIGSEGV 22810
&[1]+ Stopped top
&[root@machine ~]# fg %1
&Segmentation fault (core dumped)
方式三:在终端使用键盘发送信号
用户还可以在终端用键盘输入特定的字符(比如 control-C 或 control-\)向前台进程发送信号,终止前台进程运行。常见的中断字符组合是,使用 control-C 发送 SIGINT 信号,使用 control-\ 发送 SIGQUIT 信号,使用 control-z 发送 SIGTSTP 信号。
在实现上,当用户输入中断字符组合时,比如 control-C,终端驱动程序响应键盘输入,并且识别 control-C 是信号 SIGINT 的产生符号,然后向前台进程发送 SIGINT 信号。当前台进程再次被调用时就会接收到 SIGINT 信号。
使用键盘中断组合符号发送信号演示如下:
[root@machine ~]# ./loop.sh ( 注释:运行一个前台进程,任务是每秒钟打印一次字符串 )
i’m looping …
i’m looping …
i’m looping … ( 注释:此时,用户输入 control-C)
[root@machine ~]# ( 注释:接收到信号后,进程退出 )
对这类情况的思考
这类情况导致的进程异常退出,并不是软件编程错误所导致,而是进程外部的异步信号所致。但是我们可以在代码编写中做的更好,通过调用 signal 函数绑定信号处理程序来应对信号的到来,以提高软件的健壮性。
signal 函数的原型:
&void (*signal(int sig, void (*func)(int)))(int);
signal 函数将信号 sig 和自定义信号处理程序绑定,即当进程收到信号 sig 时自定义函数 func 被调用。如果我们希望软件在运行时屏蔽某个信号,插入下面的代码,以达到屏蔽信号 SIGINT 的效果:
(void)signal(SIGINT, SIG_IGN);
执行这一行代码后,当进程收到信号 SIGINT 后,进程就不会异常退出,而是会忽视这个信号继续运行。
更重要的场景是,进程在运行过程中可能会创建一些临时文件,我们希望进程在清理这些文件后再退出,避免遗留垃圾文件,这种情况下我们也可以调用 signal 函数实现,自定义一个信号处理程序来清理临时文件,当外部发送信号要求进程终止运行时,这个自定义信号处理程序被调用做清理工作。代码清单 2 是具体实现。
清单 2. 调用 signal 函数绑定自定义信号处理程序
/* bindSignal.c */
&void cleanTask(int sig) {
&printf( "Got the signal, deleting the tmp file\n" );
&if( access( "/tmp/temp.lock", F_OK ) != -1 ) {
&if( remove( "/tmp/temp.lock" ) != 0 )
&perror( "Error deleting file" );
&printf( "File successfully deleted\n" );
&printf( "Process existing...\n" );
&int main() {
&(void) signal( SIGINT, cleanTask );
&FILE* tmp = fopen ( "/tmp/temp.lock", "w" );
&while(1) {
&printf( "Process running happily\n" );
&sleep(1);
&if( tmp )
remove( "/tmp/temp.lock" );
运行程序:
[root@machine ~]# ./bindSignal
&Process running happily
&Process running happily
&Process running happily ( 注释:此时,用户输入 control-C)
&Got the signal, deleting the tmp file ( 注释:接收到信号后,cleanTask 被调用 )
&File successfully deleted ( 注释:cleanTask 删除临时文件 )
&Process existing... ( 注释:进程退出 )
第二类:编程错误导致进程运行时异常退出
相比于第一类情况,第二类情况在软件开发过程中是常客,是编程错误,进程运行过程中非法操作引起的。
操作系统和计算机硬件为应用程序的运行提供了硬件平台和软件支持,为应用程序提供了平台虚拟化,使进程运行在自己的进程空间。在进程看来,它自身独占整台系统,任何其它进程都无法干预,也无法进入它的进程空间。
但是操作系统和计算机硬件又约束每个进程的行为,使进程运行在用户态空间,控制权限,确保进程不会破坏系统资源,不会干涉进入其它进程的空间,确保进程合法访问内存。当进程尝试突破禁区做非法操作时,系统会立刻觉察,并且终止进程运行。
所以,第二类情况导致的进程异常退出,起源于进程自身的编程错误,错误的编码执行非法操作,操作系统和硬件制止它的非法操作,并且让进程异常退出。
在实现上,操作系统和计算机硬件通过异常和异常处理函数来阻止进程做非法操作。
异常和异常处理函数
当进程执行非法操作时,计算机会抛出处理器异常,系统执行异常处理函数以响应处理器异常,异常处理函数往往会终止进程运行。
广义的异常包括软中断 (soft interrupts) 和外设中断 (I/O interrupts) 。外设中断是系统外围设备发送给处理器的中断,它通知处理器 I/O 操作的状态,这种异常是外设的异步异常,与具体进程无关,所以它们不会造成进程的异常退出。本文讨论的异常是指 soft interrupts,是进程非法操作所导致的处理器异常,这类异常是进程执行非法操作所产生的同步异常,比如内存保护异常,除 0 异常,缺页异常等等。
处理器异常有很多种,系统为每个异常分配异常号,每个异常有相对应的异常处理函数。以 x86 处理器为例,除 0 操作产生 DEE 异常 (Divide Error Exception),异常号是 0;内存非法访问产生 GPF 异常 (General Protection Fault),异常号是 13,而缺页 (page fault) 异常的异常号是 14。当异常出现时,处理器挂起当前进程,读取异常号,然后执行相应的异常处理函数。如果异常是可修复,比如内存缺页异常,异常处理函数会修复系统错误状态,清除异常,然后重新执行一遍被中断的指令,进程继续运行;如果异常无法修复,比如内存非法访问或者除 0 操作,异常处理函数会终止进程运行。
图 2. 异常处理函数终止进程运行
实例以及分析
实例一:内存非法访问
这类问题中最常见的就是内存非法访问。内存非法访问在 UNIX 平台即 segmentation fault,在 Windows 平台这类错误称为 Access violation。
内存非法访问是指:进程在运行时尝试访问尚未分配(即,没有将物理内存映射进入进程虚拟内存空间)的内存,或者进程尝试向只读内存区域写入数据。当进程执行内存非法访问操作时,内存管理单元 MMU 会产生内存保护异常 GPF(General Protection Fault),异常号是 13。系统会立刻暂停进程的非法操作,并且跳转到 GPF 的异常处理程序,终止进程运行。
这种编程错误在编译阶段编译器不会报错,是运行时出现的错误。清单 3 是内存非法访问的一个简单实例,进程在执行第 5 行代码时执行非法内存访问,异常处理函数终止进程运行。
清单 3. 内存非法访问实例 demoSegfault.c
&int main()
char* str = "hello";
&str[0] = 'H';
&return 0;
&编译并运行:
&[root@machine ~]# gcc demoSegfault.c -o demoSegfault
&[root@machine ~]# ./demoSegfault
&Segmentation fault (core dumped)
&[root@machine ~]# gdb demoSegfault core.24065
&( 已省略不相干文本 )
&Core was generated by `./demoSegfault'.
&Program terminated with signal 11, Segmentation fault.
分析:实例中,字符串 str 是存储在内存只读区的字符串常量,而第 5 行代码尝试更改只读区的字符,所以这是内存非法操作。
进程从开始执行到异常退出经历如下几步:
1、进程执行第 5 行代码,尝试修改只读内存区的字符;
2、内存管理单元 MMU 检查到这是非法内存操作,产生保护内存异常 GPF,异常号 13;
3、处理器立刻暂停进程运行,跳转到 GPF 的异常处理函数,异常处理函数终止进程运行;
4、进程 segmentation fault,并且产生 core dump 文件。GDB 调试结果显示,进程异常退出的原因是 segmentation fault。
实例二:除 0 操作
实例二是除 0 操作,软件开发中也会引入这样的错误。当进程执行除 0 操作时,处理器上的浮点单元 FPU(Floating-point unit) 会产生 DEE 除 0 异常 (Divide Error Exception),异常号是 0。
清单 4. 除 0 操作 divide0.c
int main()
&int a = 1, b = 0,
&printf( "Start running\n" );
&printf( "About to quit\n" );
&编译并运行:
&[root@machine ~]# gcc -o divide0 divide0.c
&[root@machine ~]# ./divide0 &
&[root@machine ~]# Start running
&[1]+ Floating point exception(core dumped) ./divide0
&[root@xbng103 ~]# gdb divide0 /corefiles/core.1229
&( 已省略不相干文本 )
&Core was generated by `./divide0'.
&Program terminated with signal 8, Arithmetic exception.
分析:实例中,代码第 7 行会执行除 0 操作,导致异常出现,异常处理程序终止进程运行,并且输出错误提示:Floating point exception。
异常处理函数内幕
异常处理函数在实现上,是通过向挂起进程发送信号,进而通过信号的默认信号处理程序终止进程运行,所以异常处理函数是“间接”终止进程运行。详细过程如下:
1、进程执行非法指令或执行错误操作;
2、非法操作导致处理器异常产生;
3、系统挂起进程,读取异常号并且跳转到相应的异常处理函数;
a、异常处理函数首先查看异常是否可以恢复。如果无法恢复异常,异常处理函数向进程发送信号。发送的信号根据异常类型而定,比如内存保护异常 GPF 相对应的信号是 SIGSEGV,而除 0 异常 DEE 相对应的信号是 SIGFPE;
b、异常处理函数调用内核函数 issig() 和 psig() 来接收和处理信号。内核函数 psig() 执行默认信号处理程序,终止进程运行;
3、进程异常退出。
在此基础上,我们可以把图2进一步细化如下:&
图3. 异常处理函数终止进程运行(细化)
异常处理函数执行时会检查异常号,然后根据异常类型发送相应的信号。
再来看一下实例一(代码清单 3)的运行结果:
[root@machine ~]# ./demoSegfault
&Segmentation fault (core dumped)
&[root@machine ~]# gdb demoSegfault core.24065
&( 已省略不相干文本 )
&Core was generated by `./demoSegfault'.
&Program terminated with signal 11, Segmentation fault.
运行结果显示进程接收到信号 11 后异常退出,在 signal.h 的定义里,11 就是 SIGSEGV。MMU 产生内存保护异常 GPF(异常号 13)时,异常处理程序发送相应信号 SIGSEGV,SIGSEGV 的默认信号处理程序终止进程运行。
再来看实例二(代码清单 4)的运行结果
[root@machine ~]# ./divide0 &
&[root@machine ~]# Start running
&[1]+ Floating point exception(core dumped) ./divide0
&[root@xbng103 ~]# gdb divide0 /corefiles/core.1229
&( 已省略不相干文本 )
&Core was generated by `./divide0'.
&Program terminated with signal 8, Arithmetic exception.
分析结果显示进程接收到信号 8 后异常退出,在 signal.h 的定义里,8 就是信号 SIGFPE。除 0 操作产生异常(异常号 0),异常处理程序发送相应信号 SIGFPE 给挂起进程,SIGFPE 的默认信号处理程序终止进程运行。
“信号”是进程异常退出的直接原因
信号与进程异常退出有着紧密的关系:第一类情况是因为外部环境向进程发送信号,这种情况下发送的信号是异步信号,信号的到来与进程的运行是异步的;第二类情况是进程非法操作触发处理器异常,然后异常处理函数在内核态向进程发送信号,这种情况下发送的信号是同步信号,信号的到来与进程的运行是同步的。这两种情况都有信号产生,并且最终都是信号处理程序终止进程运行。它们的区别是信号产生的信号源不同,前者是外部信号源产生异步信号,后者是进程自身作为信号源产生同步信号。
所以,信号是进程异常退出的直接原因。当进程异常退出时,进程必然接收到了信号。
避免和调试进程异常退出
软件开发过程中,我们应当避免进程异常退出,针对导致进程异常退出的这两类问题,对软件开发者的几点建议:
1、通常情况无需屏蔽外部信号。信号作为进程间的一种通信方式,异步信号到来意味着外部要求进程的退出;
2、绑定自定义信号处理程序做清理工作,当外部信号到来时,确保进程异常退出前,自定义信号处理程序被调用做清理工作,比如删除创建的临时文件。
3、针对第二类情况,编程过程中确保进程不要做非法操作,尤其是在访问内存时,确保内存已经分配给进程(映射入进程虚拟地址空间),不要向只读区写入数据。
问题调试和定位
进程异常退出时,操作系统会产生 core dump 文件,cored ump 文件是进程异常退出前内存状态的快照,运行 GDB 分析 core dump 文件可以帮助调试和定位问题。
1) 首先,分析 core dump 查看导致进程异常退出的具体信号和退出原因。
使用 GDB 调试实例一(代码清单 3)的分析结果如下:
[root@machine ~]# gdb demoSegfault core.24065
&( 已省略不相干文本 )
&Core was generated by `./demoSegfault'.
&Program terminated with signal 11, Segmentation fault.
分析结果显示,终止进程运行的信号是 11,SIGSEGV,原因是内存非法访问。
2) 然后,定位错误代码。
在 GDB 分析 core dump 时,输入“bt”指令打印进程退出时的代码调用链,即 backtrace,就可以定位到错误代码。
用 gcc 编译程序时加入参数 -g 可以生成符号文件,帮助调试。
重新编译、执行实例一,并且分析 core dump 文件,定位错误代码:
[root@machine ~]# gcc -o demoSegfault demoSegfault.c -g
&[root@machine ~]# ./demoSegfault &
&[1] 28066
&[1]+ Segmentation fault (core dumped) ./demoSegfault
&[root@machine ~]# gdb demoSegfault /corefiles/core.28066
&( 已省略不相干文本 )
&Core was generated by `./demoSegfault'.
&Program terminated with signal 11, Segmentation fault.
&#0 0x0804835a in main () at demoSegfault.c:5
&5 str[0] = 'H';
&#0 0x0804835a in main () at demoSegfault.c:5
在加了参数 -g 编译后,我们可以用 gdb 解析出更多的信息帮助我们调试。在输入“bt”后,GDB 输出提示错误出现在第 5 行。
3) 最后,在定位到错误代码行后,就可以很快知道根本原因,并且修改错误代码。
阅读(428) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。新手提示:
游戏中按住TAB键可以观看战斗计分板。
如果出门不知道如何买装备,不妨先买一双草鞋和若干血瓶。
游戏中按字母Y键可以切换视角。
有些装备是有主动技能的,按对应的数字键就可施放。
战斗中建议多多看看小地图,其他线路的敌人若不见了,就要小心了。
每天的第一次胜利是有额外的奖励的,包括人机模式。
游戏中左侧队友的图标上各有一个小圆点,当小圆点呈绿色时,表示此队友大招可施放。
在附近草丛插眼可以有效的防止自己被敌军偷袭。
击杀野区的红蓝BUFF怪物可获得相应的BUFF加成。
看过电玩巴士攻略再去打LOL的胜率一般都会提高百分之八十。
新手英雄介绍
小提示操作简单的英雄更适合新手
常用工具下载
帮助你快速玩转英雄联盟
查看英雄到达各级时的属性
模拟游戏中的天赋加点
符文介绍、显示安装符文后属性
lol 9月25日更新后游戏崩溃 最全面的解决办法
作者:艾斯瑞尔 来源:TGBUS整理  发布时间:09-25 17:39
  lol 9月25日官方为了调整一些装备数据和英雄属性,同时增加一些商城的新功能,对全服的服务器进行了更新,今天中午12点才可以进行游戏,lol更新后不少玩家发现进入游戏后游戏总是崩溃,今天小编就来告诉引起lol游戏崩溃的原因以及解决办法。
lol游戏崩溃
  如果你的崩溃了,请认真往下看。
  1.是否开过多玩盒子,173神灯等辅助工具。
  解决办法:最麻烦,修复不行?OK,卸载盒子,神灯。
  记住是卸载,卸载和删除不一样。删除掉的童鞋也不用紧张,进入电脑注册表,删掉所有神灯OR盒子的注册表文件。卸载游戏,重启电脑。
  2.是否用360游戏提速器优化过网络进程。
  解决办法:由于360提速器优化完了以后关闭了一些必要的系统服务。这个很简单,点击右上角的一键恢复。
  3.显卡驱动是否最新。
  解决办法:有的童鞋不知道怎么更新驱动,下载个驱动人生就OK了,更新一下显卡驱动,重启。
  4.电脑是否有病毒,木马。是否有其他软件占用的了过多的网络。尤其是播放器的后台加速器,比如PPS,I酷等等。
  解决办法:可以用360对电脑进行全盘的杀毒,清理插件,清理系统垃圾,修复系统,关闭不必要的开机程序,如PPS I酷后台。
  5.游戏聊天、字体问题
  解决办法:重新安装一个新客服端在其他路径,下载一个微软雅黑字体丢入系统字体库中,控制面板&&字体库&&直接把下载的字体丢进入就自动安装了。
lol下载页面
  如果以上方法都不行,那就用最后这个方法:重新下载客户端
数据库 站内搜索重新下载(9.2)版更新完安装时弹出一个提示(安装进程异常退出)
||||||||||
Powered by &当前位置:
炫舞安装进程异常退出怎么办&解决方式
作者:巴士大梦 来源:本站原创 发布时间: 16:24:15
  玩家问题:
  炫舞安装进程异常退出怎么办?解决方式
  小编回答:
  关于安装进程异常退出这个问题,在玩家安装炫舞时会出现这个问题,下面就由小编为大家介绍一下如何解决安装进程异常退出这个问题,当您退出后可以重新安装试试,或者可以下载补丁手动进行更新试试,补丁下载:,前去官网下载补丁也是可以的!
相关的文章

我要回帖

更多关于 拨号进程忙或异常退出 的文章

 

随机推荐