我想强制在我的C ++应用程序的特定位置的核心转储。
我知道我可以做这样的事情:
int * crash = NULL; *crash = 1;
但是我想知道是否有更清洁的方法?
顺便说一句,我正在使用Linux。
jenkins窗口奴隶build立“无法中止”的错误
取消长时间运行下载
C中的中止函数
最后在调用Thread.Abort时不会执行
中止信号的一般原因是什么?
中止Linux轮询
MessageBox“exception程序终止”让我的应用程序继续运行
当用户中止请求时,如何让PHP-FPM进程终止? (Nginx的)
信号编号6( SIGABRT在Linux中)的提高是一种方法(尽管要记住,在所有的POSIX实现中SIGABRT不要求是6,所以如果这不是快速的,你可能想要使用SIGABRT值本身'n'dirty调试代码)。
#include <signal.h> : : : raise (SIGABRT);
调用abort()也会导致核心转储,甚至可以在不终止进程的情况下通过在子进程中调用fork()和abort()来完成此任务 – 请参阅此答案以获取详细信息。
几年前,Google发布了Coredumper库。
概观
Coredumper库可以被编译成应用程序来创建正在运行的程序的核心转储 – 无需终止。 即使内核本身不支持多线程核心文件,它也支持单线程和多线程核心转储。
Coredumper是根据BSD许可条款分发的。
例
这绝不是一个完整的例子。 它只是给你一个Coredumper API的样子。
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* Keep going,we generated a core file,* but we didn't crash. */
这不是你要求的,但也许它更好:)
#include <stdlib.h> // C //#include <cstdlib> // C++ void core_dump(void) { abort(); }
如信号手册页中所列,任何具有列为“核心”动作的信号都将强制进行核心转储。 一些例子是:
SIGQUIT 3 Core Quit from keyboard SIGILL 4 Core Illegal Instruction SIGABRT 6 Core Abort signal from abort(3) SIGFPE 8 Core Floating point exception SIGSEGV 11 Core Invalid memory reference
确保你启用了核心转储:
ulimit -c unlimited
中止();
相关的,有时你会想要一个没有实际核心转储的后台跟踪,并允许程序继续运行:检查glibc backtrace()和backtrace_symbols()函数: http : //www.gnu.org/s/libc/手动/ html_node / Backtraces.html
你可以使用kill(2)发送信号。
#include <sys/types.h> #include <signal.h> int kill(pid_t pid,int sig);
所以,
kill(getpid(),SIGSEGV);
$ bash $ kill -s SIGSEGV $$
只要创建一个新的bash实例,并用指定的信号杀死它。 $$是shell的PID。 否则,你正在杀死你当前的bash,将被注销,终端关闭或断开连接。
$ bash $ kill -s SIGABRT $$ $ bash $ kill -s SIGFPE $$
有时这样做可能是适当的:
int st = 0; pid_t p = fork(); if (!p) { signal(SIGABRT,SIG_DFL); abort(); // having the coredump of the exact copy of the calling thread } else { waitpid(p,&st,0); // rip the zombie } // here the original process continues to live
#include <assert.h> . . . assert(!"this should not happen");
#include <stdio.h> #include <stdlib.h> int main() { printf("n"); printf("Process is abortingn"); abort(); printf("Control not reaching heren"); return 0; }
使用这种方法,无论你想:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。