Answers:
abort()
发送呼叫过程的SIGABRT
信号,这abort()
基本上是如何工作的。
abort()
通常由检测内部错误或严重破坏约束的库函数调用。例如,如果堆的内部结构被堆溢出损坏,malloc()
将调用abort()
。
libc
尝试调用free()
未初始化/损坏的指针而发送的
Close()
方法,因此被遗忘了。虽然覆盖面很大。:rolleyes:
GNU libc会/dev/tty
在调用之前将有关某些致命状况的信息打印出来abort()
(然后触发SIGABRT
),但是如果您将程序作为服务运行,或者不在真正的终端窗口中运行,则这些消息可能会丢失,因为没有tty显示消息。
请参阅我关于将libc重定向到stderr而不是/ dev / tty的文章:
进程从自身获取SIGABRT的情况:Hrvoje提到了从ctor调用一个隐藏的纯虚函数以生成异常,为此我重新创建了一个示例。在这里,当构造d时,它首先调用其基类A ctor,并将内部指针传递给它自己。在表填充有效指针之前,A 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无限
运行:./ 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
验证码:
迪斯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 pid int sig = 6 = SIGABRT
:)
我将从竞争性编程中给出我的答案(cp)角度,但它也适用于其他领域。
在执行cp时,约束很多次。
例如:我有一个变量N, M, Q
这样的问题:1 ≤ N, M, Q < 10^5
。
我正在这个错误是我声明一个2D整数尺寸的阵列10000 x 10000
中C++
,并与挣扎SIGABRT
在Codechef误差近2天。
现在,如果我们计算:
整数的典型大小:4个字节
数组中的单元数:10000 x 10000
总大小(以字节为单位):400000000字节= 4 * 10 ^ 8≈400 MB
您可以针对此类问题的解决方案在您的PC上运行(并非总是如此),因为它可以承受这种大小。
但是,编码站点(在线裁判)上的资源仅限于几个KB。
因此,该SIGABRT
错误和其他此类错误。
结论:
在这样的问题中,我们不应该声明一个数组或向量或任何其他大小的DS,但我们的任务是使算法高效,使其在没有它们(DS)或内存较少的情况下也可以工作。
PS:可能有其他原因导致此错误。以上就是其中之一。