段错误为什么程序会退出?谁让退出的?

为你找各种文档 2008-09-23 10:42:27
段错误为什么程序会退出?谁让退出的?

很常见的现象,现在要问问原因,请高手指点。
...全文
463 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆 2008-10-06
  • 打赏
  • 举报
回复
顶,高手多多啊
everysmile 2008-10-02
  • 打赏
  • 举报
回复
段错误一般是因为出现了非法访问的错误,有可能是访问的指针没有对其进行对应的赋值。
如果是应用程序的话,就是段错误,在内核程序的话,就会出现kernel panic.
chenhj_wo 2008-09-28
  • 打赏
  • 举报
回复
系统默认处理方式就是退出,可以自己写信号处理函数!
xlanchen 2008-09-28
  • 打赏
  • 举报
回复 1
段错误,由内核识别并且通过信号SIGSEGV通知用户进程。

引起信号SIGSEGV的原因有很多。

比较典型的是,访问导致缺页时,将会判断这个访问是否是有效的,如果是有效的则内核负责为进程补上页面;否则内核通过信号SIGSEGV通知用户进程访问出错。

信号机制允许用户进程为某些信号的处理进行个性化定制。如果没有定制,则信号机制按照内核提供的缺省方案进行处理,那就是上面那位同志说的:

[Quote=引用 3 楼 bshawk 的回复:]
段错误对应的信号是SIGSEGV! 它的默认行为是: "Core  Default action is to terminate the process and dump core"!
所以,如果你程序中不捕获信号SIGSEGV,那么其默认的处理方式是:中止程序并dump一份程序结束时的状态信息!

当然,你可以在程序中捕获该信号,简单的可以用signal()注册一个SIGSEGV的处理函数,那么这时候当发生SIGSEGV的时候,就会调用你注册的函数了! 而不是前面的默认行为!

对信号的捕获和处理,是…
[/Quote]
once_and_again 2008-09-24
  • 打赏
  • 举报
回复
1)访问系统数据区,尤其是往 系统保护的内存地址写数据

2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域

实现这些的应该是os底层的?意思应该是程序没法运行了,比如一个变量,
运行的时候值是变的,如果没有这个变量的内存,自然就退出了,
段错误编译时候没问题,运行才有问题,这个问题好比死的人为什么不能吃饭?

jufeng2309 2008-09-23
  • 打赏
  • 举报
回复
段错误其实还是内存问题。。
遇到这个错误的时候系统就好像接到了ctrl +c信号退出
这些都是内核来监听的。
realdragon2 2008-09-23
  • 打赏
  • 举报
回复
UP~
[Quote=引用 3 楼 bshawk 的回复:]
段错误对应的信号是SIGSEGV! 它的默认行为是: "Core Default action is to terminate the process and dump core"!
所以,如果你程序中不捕获信号SIGSEGV,那么其默认的处理方式是:中止程序并dump一份程序结束时的状态信息!

当然,你可以在程序中捕获该信号,简单的可以用signal()注册一个SIGSEGV的处理函数,那么这时候当发生SIGSEGV的时候,就会调用你注册的函数了! 而不是前面的默认行为!

对信号的捕获和处理,…
[/Quote]
bshawk 2008-09-23
  • 打赏
  • 举报
回复
段错误对应的信号是SIGSEGV! 它的默认行为是: "Core Default action is to terminate the process and dump core"!
所以,如果你程序中不捕获信号SIGSEGV,那么其默认的处理方式是:中止程序并dump一份程序结束时的状态信息!

当然,你可以在程序中捕获该信号,简单的可以用signal()注册一个SIGSEGV的处理函数,那么这时候当发生SIGSEGV的时候,就会调用你注册的函数了! 而不是前面的默认行为!

对信号的捕获和处理,是在内核中进行的!
  • 打赏
  • 举报
回复
c语言的编译器与程序执行没什么关系,编译完成后它的工作就完了
Erorr 2008-09-23
  • 打赏
  • 举报
回复
进程管理是操作系统的事情,所以进程遇到问题时,操作系统会终止进程,并把相关数据保存下来用来分析,这些数据就是core dump file
chenzhixin 2008-09-23
  • 打赏
  • 举报
回复
可能是内核让退出的吧,访问不该访问的地方,或者是C语言的编译器
jy00923702 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bshawk 的回复:]
段错误对应的信号是SIGSEGV! 它的默认行为是: "Core Default action is to terminate the process and dump core"!
所以,如果你程序中不捕获信号SIGSEGV,那么其默认的处理方式是:中止程序并dump一份程序结束时的状态信息!

当然,你可以在程序中捕获该信号,简单的可以用signal()注册一个SIGSEGV的处理函数,那么这时候当发生SIGSEGV的时候,就会调用你注册的函数了! 而不是前面的默认行为!

对信号的捕获和处理,…
[/Quote]

顶下这位仁兄的意见
个人认为正解。
另外一般来说SIGSEGV信号都是程序越界访问地址造成的,或者是内存溢出(其实本质上也是越界访问),基于内存保护机制内核会终止该进程
犇犇犇程序猿 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rzsheng 的回复:]
引用 3 楼 bshawk 的回复:
段错误对应的信号是SIGSEGV! 它的默认行为是: "Core Default action is to terminate the process and dump core"!
所以,如果你程序中不捕获信号SIGSEGV,那么其默认的处理方式是:中止程序并dump一份程序结束时的状态信息!

当然,你可以在程序中捕获该信号,简单的可以用signal()注册一个SIGSEGV的处理函数,那么这时候当发生SIGSEGV的时候,就会调用你注册的函数了! 而不是前面的默认行为…
[/Quote]

很好!
rzsheng 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bshawk 的回复:]
段错误对应的信号是SIGSEGV! 它的默认行为是: "Core Default action is to terminate the process and dump core"!
所以,如果你程序中不捕获信号SIGSEGV,那么其默认的处理方式是:中止程序并dump一份程序结束时的状态信息!

当然,你可以在程序中捕获该信号,简单的可以用signal()注册一个SIGSEGV的处理函数,那么这时候当发生SIGSEGV的时候,就会调用你注册的函数了! 而不是前面的默认行为!

对信号的捕获和处理,是在内核中进行的!
[/Quote]

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧