8 ответов:
abort()отправляет вызывающий процессSIGABRTсигнал, это какabort()в основном работает.
abort()обычно вызывается библиотечными функциями, которые обнаруживают внутреннюю ошибку или какое-либо серьезно нарушенное ограничение. Напримерmalloc()будем называтьabort()если его внутренние структуры повреждены переполнение кучи.
вы можете отправить любой сигнал в любой процесс с помощью
kill(2)интерфейс:
kill -SIGABRT 3082330823 был
dashпроцесс я начал, так что я мог легко найти процесс, который я хотел убить.$ /bin/dash $ AbortedThe
Abortedвыход, по-видимому, какdashсообщает SIGABRT.он может быть отправлен непосредственно в любой процесс с помощью
kill(2), или процесс может послать сигнал самому черезassert(3),abort(3)илиraise(3).
SIGABRTобычно используется libc и другими библиотеками для прерывания программы в случае критических ошибок. Например, glibc отправляетSIGABRTв случае обнаружения двойного свободного или других повреждений кучи.кроме того, большинство
assertреализации используютSIGABRTв случае не утверждать.кроме того,
SIGABRTможет быть отправлен из любого другого процесса, как и любой другой сигнал. Конечно, процесс отправки должен выполняться от имени того же пользователя или root.
обычно это происходит, когда возникает проблема с выделением памяти.
Это случилось со мной, когда я моя программа пытается выделить массив с отрицательным размером.
есть еще одна простая причина в случае c++.
std::thread::~thread{ if((joinable ()) std::terminate (); }т. е. область потока закончилась, но вы забыли позвонить либо
thread::join();или
thread::detach();
GNU libc будет печатать информацию в
/dev/ttyотносительно некоторых смертельных состояний, прежде чем он позвонитabort()(который затем инициируетSIGABRT), но если вы запускаете свою программу как сервис или иным образом не в реальном окне терминала, эти сообщения могут потеряться, потому что нет tty для отображения сообщений.см. мой пост о перенаправлении libc для записи в stderr вместо /dev / tty:
перехват сообщений об ошибках libc, перенаправление с /dev / tty
в случае, когда процесс получения сигналу sigabrt от себя: Hrvoje упомянул о похороненном чистом виртуальном существе, вызванном из ctor, генерирующего прерывание, я воссоздал пример для этого. Вот когда будет построен, он сначала вызывает конструктор своего базового класса, и передает внутри указатель на себя. ctor вызывает чистый виртуальный метод до того, как таблица была заполнена допустимым указателем, потому что d еще не построен.
#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; }компиляция: g++ - o aa aa.cpp
ulimit-c неограниченный
run: ./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проверить код:
disas 0x7feae3170c37
mov xea,%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 PID int sig = 6 = SIGABRT
:)
в моем случае это было связано с входом в массив с индексом, равным длине массива.
string x[5]; for(int i=1; i<=5; i++){ cin>>x[i]; }x [5] доступ к которому отсутствует.
Comments