当前位置: 技术问答>linux和unix
学习APUE遇到的问题,错误处理函数err_dump看不懂
来源: 互联网 发布时间:2017-05-02
本文导语: 小弟在学APUE,看到书里面有个错误处理函数err_dump, /* *Fatal error related to a system call *print a message ,dump core,and terminate */ void err_dump(const char *fmt,...) { va_list ap; va_start(ap,fmt); err_doit(1,errno,fmt,ap...
小弟在学APUE,看到书里面有个错误处理函数err_dump,
err_doit 函数打印出错信息,可abort()函数是干什么的?我知道该函数能terminate进程,可dump core是什么意思?还有exit()不也是terminate进程的吗?干嘛又调用abort()又调用exit()?求解答
非常感谢
/*
*Fatal error related to a system call
*print a message ,dump core,and terminate
*/
void err_dump(const char *fmt,...)
{
va_list ap;
va_start(ap,fmt);
err_doit(1,errno,fmt,ap);
va_end(ap);
abort(); /*dump core and terminate*/
exit(1);
}
err_doit 函数打印出错信息,可abort()函数是干什么的?我知道该函数能terminate进程,可dump core是什么意思?还有exit()不也是terminate进程的吗?干嘛又调用abort()又调用exit()?求解答
非常感谢
|
没看过这本书.
man
应该是配合 ulimit -c 这个使用.
使出错, ``已放弃(吐核)`` 吐核就是dump core吧.
生成core文件.保存出错当时状态,使用gdb可以调试.
core文件参见wiki [http://zh.wikipedia.org/zh/%E6%A0%B8%E5%BF%83%E6%96%87%E4%BB%B6]
简单使用/利用(用来调试) [http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html]
调试错误时非常有用
man
abort - cause abnormal process termination
应该是配合 ulimit -c 这个使用.
使出错, ``已放弃(吐核)`` 吐核就是dump core吧.
生成core文件.保存出错当时状态,使用gdb可以调试.
core文件参见wiki [http://zh.wikipedia.org/zh/%E6%A0%B8%E5%BF%83%E6%96%87%E4%BB%B6]
简单使用/利用(用来调试) [http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html]
调试错误时非常有用
|
错误之后生成core文件方便调试,很有用的。至于后面的问题我找到了一个答案:
详见http://bbs.csdn.net/topics/380205711
void abort(void) /* POSIX-style abort() function */
{
sigset_t mask;
struct sigaction action;
......
action.sa_handler = SIG_DFL;
sigaction(SIGABRT, &action, NULL); /* reset to default */
sigprocmask(SIG_SETMASK, &mask, NULL); /* just in case ... */
kill(getpid(), SIGABRT); /* and one more time */
exit(1); /* this should never be executed ... */
}
详见http://bbs.csdn.net/topics/380205711
void abort(void) /* POSIX-style abort() function */
{
sigset_t mask;
struct sigaction action;
......
action.sa_handler = SIG_DFL;
sigaction(SIGABRT, &action, NULL); /* reset to default */
sigprocmask(SIG_SETMASK, &mask, NULL); /* just in case ... */
kill(getpid(), SIGABRT); /* and one more time */
exit(1); /* this should never be executed ... */
}