एक मामला है जब प्रक्रिया से ही SIGABRT मिलती है: हर्वोजे एक दफन शुद्ध आभासी किया जा रहा है एक बीच में बंद करें पैदा ctor से कहा जाता है के बारे में उल्लेख किया है, मैं इस के लिए एक उदाहरण निर्मित। यहां जब डी का निर्माण किया जाना है, तो पहले यह अपनी बेस क्लास ए सीटीओआर, कहता है और पॉइंटर के अंदर ही पास हो जाता है। एक सीटीओआर शुद्ध पॉइंटर, से भरने से पहले शुद्ध वर्चुअल विधि को कॉल करता है क्योंकि डी अभी तक नहीं बनाया गया है।
#include<iostream>
using namespace std;
class A {
public:
A(A *pa){pa->f();}
virtual void f()=0;
};
class D : public A {
public:
D():A(this){}
virtual void f() {cout<<"D::f\n";}
};
int main(){
D d;
A *pa = &d;
pa->f();
return 0;
}
संकलन: जी ++ -ओ आ aa.cpp
ulimit -c असीमित
रन: ./aa
pure virtual method called
terminate called without an active exception
Aborted (core dumped)
अब जल्दी से कोर फ़ाइल देखते हैं, और मान्य की सुविधा देता है कि SIGABRT को वास्तव में बुलाया गया था:
gdb aa core
i r
rdx 0x6 6
rsi 0x69a 1690
rdi 0x69a 1690
rip 0x7feae3170c37
चेक कोड::
regs देख
disas 0x7feae3170c37
mov $0xea,%eax = 234 <- this is the kill syscall, sends signal to process
syscall <-----
http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
234 sys_tgkill pid_t tgid pid_t पीआईडी पूर्णांक sig = 6 = SIGABRT
:)
स्रोत
2017-03-29 08:20:11
कुछ तरीके हैं। सबसे आसान तरीका, यदि आपने प्रोग्राम लिखा है, तो सिगैबर्ट के लिए सिग्नल हैंडलर पंजीकृत करना है जो उस जानकारी को प्रिंट करता है और लौटने से पहले अपनी धाराओं को फ्लश करता है। कार्यक्रम को चलाने के लिए दूसरा सबसे आसान तरीका है। तीसरा सबसे आसान तरीका यह सुनिश्चित करना है कि कार्यक्रम क्रैश होने पर कोर फ़ाइल उत्पन्न करता है, और कोर डंप के माध्यम से पता लगाता है। अधिकांश मामलों में –