c++ - प्रोग्रामिंग के कारण सी/सी++ में कोर डंप का कारण बनता है




linux coredump (7)

मैं अपने सी ++ एप्लिकेशन में किसी विशिष्ट स्थान पर कोर डंप को मजबूर करना चाहता हूं।

मुझे पता है कि मैं ऐसा कुछ कर कर ऐसा कर सकता हूं:

int * crash = NULL;
*crash = 1;

लेकिन मैं जानना चाहूंगा कि क्लीनर तरीका है या नहीं?

मैं रास्ते से लिनक्स का उपयोग कर रहा हूँ।


आप सिग्नल भेजने के लिए kill(2) का उपयोग कर सकते हैं।

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);

इसलिए,

kill(getpid(), SIGSEGV);

कभी-कभी यह इस तरह की smth करने के लिए उपयुक्त हो सकता है:

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

इस सरल दृष्टिकोण के साथ एक समस्या यह है कि केवल एक धागा को coredumped किया जाएगा।


कोर डंप उत्पन्न करने का एक और तरीका:

$ bash
$ kill -s SIGSEGV $$

बस बैश का एक नया उदाहरण बनाएं और निर्दिष्ट सिग्नल के साथ इसे मार दें। $$ खोल का पीआईडी ​​है। अन्यथा आप अपने वर्तमान बैश को मार रहे हैं और लॉग आउट हो जाएंगे, टर्मिनल बंद या डिस्कनेक्ट हो जाएंगे।

$ bash 
$ kill -s SIGABRT $$
$ bash
$ kill -s SIGFPE $$

गर्भपात ();

संबंधित, कभी-कभी आप वास्तविक कोर डंप के बिना बैक ट्रेस चाहते हैं, और प्रोग्राम को जारी रखने की अनुमति दें: glibc बैकट्रैक () और backtrace_symbols () फ़ंक्शंस देखें: http://www.gnu.org/s/libc/manual/html_node/Backtraces.html


सिग्नल नंबर 6 (लिनक्स में SIGABRT ) को बढ़ाने का एक तरीका है (हालांकि ध्यान रखें कि SIGABRT को सभी POSIX कार्यान्वयन में 6 होना आवश्यक नहीं है, इसलिए यदि आप जल्दी से कुछ भी हैं तो आप SIGABRT मान का उपयोग करना चाहेंगे 'n'dirty डीबग कोड)।

#include <signal.h>
: : :
raise (SIGABRT);

कॉलिंग abort() कोर डंप का भी कारण बनता है, और आप केवल बच्चे में fork() द्वारा abort() को कॉल करके अपनी प्रक्रिया को समाप्त किए बिना भी कर सकते हैं - विवरण के लिए यह उत्तर देखें।


 #include <stdio.h>
 #include <stdlib.h>
 int main()
 {
   printf("\n");
   printf("Process is aborting\n");
   abort();
   printf("Control not reaching here\n");
   return 0;
 }

जहां चाहें इस दृष्टिकोण का उपयोग करें :)


#include <stdlib.h>   // C
//#include <cstdlib>  // C++

void core_dump(void)
{
    abort();
}





abort